2016-05-13 81 views
-1

我有一個C項目,我想在Android上啓動。從Android應用程序運行C二進制文件:particulare case

我使用NDK編譯項目,生成二進制文件並將其嵌入到應用程序中以啓動它。 該項目使用自動工具,我用androgenizer來生成並修改Android.mk。 它也使用openssl,所以我編譯它爲android後this和二進制使用編譯libcrypto.so

應用程序只作用:

  • 裝入libcrypto.so
  • 複製二進制
  • 執行二進制

這裏是一段代碼

Process mybinProcess; 
File target = new File(getFilesDir(), "mybin"); 
InputStream in = getResources().openRawResource(R.raw.mybin); 

try { 
    OutputStream out = new FileOutputStream(target); 
    FileUtils.copy(in, out); 
    FileUtils.chmod(target, 0755); 

if(target.exists()){ 
    String[] command = {target.getAbsolutePath()}; 
    mybinProcess = Runtime.getRuntime().exec(command); 
    BufferedReader output = FileUtils.getOuput(mybinProcess); 
    BufferedReader error = FileUtils.getError(mybinProcess); 

    // [...] print stdout et stderr 

    mybinProcess.waitFor(); 
    int exitval=mybinProcess.exitValue(); //exit value is 1 

標準輸出給我在二元yntax錯誤:

/data/data/com.myproject.mybin/files/mybin[1]: syntax error: ' 4 4' unexpected 

,當我試圖從亞行外殼啓動二進制,得到了錯誤

[email protected]_x86:/data/user/0/com.myproject/files # ./mybin 
/system/bin/sh: ./mybin: not executable: 32-bit ELF file 

我在十六進制編輯器打開mybin,語法錯誤之前,來lib /usr/lib/libc.so.1的字符串。但在模擬器上目錄/usr不存在。我認爲它來自ndk,ndk-build的最後一個編輯行包含<ndk>/platforms/android-19/arch-arm/usr/lib。此外,在<ndk>/platforms/android-19/arch-arm/usr/lib中只有libc.so而不是libc.so.1

任何想法,我可以搜索解決它,使其工作?


我的配置:

  • NDK:r11c
  • Android平臺:19
  • 的Android工作室:2.1
  • SDK:r24.4.1
  • mybin(NDK)編上Linux和Windows上的apk(Android Studio)

回答

2

建立一個可執行文件在Android上運行是possible,但不是正確的做法IMO,你應該建立一個JNI接口到你的本地二進制庫並調用C庫。

這裏有一個簡單的例子:

http://developer.android.com/ndk/samples/sample_hellojni.html

我們已經有很多使用javacpp,如果你有很多的JNI調用來生成JNI代碼的成功。如果你只需要一兩個電話,我可能會用手寫。

+0

如果我使用我的C代碼作爲庫,我必須用Java重寫整個項目。我想直接在Android上啓動二進制文件,並遵循ndk生成可執行指令,它生成了一個不可用的可執行文件... –

+1

@ raja.b'如果我使用我的C代碼作爲庫,我必須重寫整個項目在Java中'我不確定我會關注你。我建議按照原樣離開C代碼,但不要將C代碼構建爲可執行文件,而應使用一種或兩種方法創建一個C庫,以便從庫中獲取數據。然後在java端創建相同的JNI方法來與之交互。比處理命令界面和從輸出中刮取文本要容易得多。如果你確實做到了這一點,但可能無法在所有設備上正常工作。 –

+0

@GaryBack'比處理命令界面和從輸出中抓取文本要容易得多。 '。目前,沒有必要處理文本輸出。這是進一步的一步,在進行二進制運行後,使用java端來進行接口將是最好的選擇。我不理解的事實是由ndk生成的二進制文件與目標平臺不兼容(32位錯誤,語法錯誤)。 –

相關問題