2011-01-16 28 views
14

Vâng, tôi đã lặn trong vùng nước u ám của chương trình Android cấp thấp (bản địa C/C++ bằng cách sử dụng chuỗi công cụ CodeSourcery). Tôi đã thử thực thi trên một trình mô phỏng và nó hoạt động. Tôi muốn thử nó trên một thiết bị thực sự. Vì vậy, tôi cắm vào mối quan hệ của tôi và đẩy các tập tin vào hệ thống tập tin. Sau đó, tôi đã cố gắng để thực hiện nhị phân, và tôi nhận được một lỗi cho phép. Nó thực sự không quan trọng làm thế nào tôi gắn kết nó, hoặc nơi tôi gửi nó, tôi không phải gốc và nó không cho phép tôi thực hiện nó. Có cách nào để chạy một chương trình như thế này trên một điện thoại không bắt nguồn từ?Có thể chạy bản nhị phân cánh tay gốc trên điện thoại Android không bắt nguồn từ không?

+0

Bạn gần như chắc chắn sẽ cần root. Làm thế nào bạn thậm chí có được nó trên điện thoại nếu điện thoại của bạn không bắt nguồn từ? – Falmarri

+3

Bạn đã đặt nhị phân ở đâu? Bạn không thể đặt nó trên sdcard vì nó được gắn với tùy chọn "noexec" (trừ khi bắt nguồn từ). –

+0

Chính xác, đó là lý do tại sao nó không hoạt động trên sdcard. Tôi đã có thể đặt nó vào/data (nhưng nó sẽ không thực hiện hoặc thậm chí cho tôi chmod nó). Về cách đặt tệp thi hành vào hệ thống tệp: "adb push". – AnimatedRNG

Trả lời

33

Sau khi sử dụng chuỗi công cụ được bao gồm trong NDK của Android để biên dịch các tệp nhị phân của bạn, bạn có thể đóng gói chúng bằng ứng dụng Android thông thường và khiến chúng xuất hiện dưới dạng các quy trình con.

Bạn sẽ phải bao gồm tất cả các tệp cần thiết trong thư mục nội dung của ứng dụng. Để chạy chúng, bạn cần phải có chương trình sao chép chúng từ thư mục nội dung đến một vị trí Runnable như: /data/data/com.yourdomain.yourapp/nativeFolder

Bạn có thể làm điều này như sau:

private static void copyFile(String assetPath, String localPath, Context context) { 
    try { 
     InputStream in = context.getAssets().open(assetPath); 
     FileOutputStream out = new FileOutputStream(localPath); 
     int read; 
     byte[] buffer = new byte[4096]; 
     while ((read = in.read(buffer)) > 0) { 
      out.write(buffer, 0, read); 
     } 
     out.close(); 
     in.close(); 

    } catch (IOException e) { 
     throw new RuntimeException(e); 
    } 
} 

Hãy nhớ rằng assetPath không tuyệt đối nhưng đối với nội dung /.

IE: "tài sản/nativeFolder" chỉ là "nativeFolder"

Để sau đó chạy ứng dụng của bạn và đọc sản lượng của nó bạn có thể làm một cái gì đó như thế này:

Process nativeApp = Runtime.getRuntime().exec("/data/data/com.yourdomain.yourapp/nativeFolder/application"); 


      BufferedReader reader = new BufferedReader(new InputStreamReader(nativeApp.getInputStream())); 
      int read; 
      char[] buffer = new char[4096]; 
      StringBuffer output = new StringBuffer(); 
      while ((read = reader.read(buffer)) > 0) { 
       output.append(buffer, 0, read); 
      } 
      reader.close(); 

      // Waits for the command to finish. 
      nativeApp.waitFor(); 

      String nativeOutput = output.toString(); 
+0

Xin cảm ơn! Điều này làm việc hoàn hảo! – AnimatedRNG

+1

Rất vui được trợ giúp. Rất thích nhìn thấy google làm cho bên không JNI của NDK dễ sử dụng hơn một chút. – sarwar

+0

Cảm ơn vì điều này, làm cho cuộc sống của tôi dễ dàng hơn nhiều! –

Các vấn đề liên quan