我有一個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)
如果我使用我的C代碼作爲庫,我必須用Java重寫整個項目。我想直接在Android上啓動二進制文件,並遵循ndk生成可執行指令,它生成了一個不可用的可執行文件... –
@ raja.b'如果我使用我的C代碼作爲庫,我必須重寫整個項目在Java中'我不確定我會關注你。我建議按照原樣離開C代碼,但不要將C代碼構建爲可執行文件,而應使用一種或兩種方法創建一個C庫,以便從庫中獲取數據。然後在java端創建相同的JNI方法來與之交互。比處理命令界面和從輸出中刮取文本要容易得多。如果你確實做到了這一點,但可能無法在所有設備上正常工作。 –
@GaryBack'比處理命令界面和從輸出中抓取文本要容易得多。 '。目前,沒有必要處理文本輸出。這是進一步的一步,在進行二進制運行後,使用java端來進行接口將是最好的選擇。我不理解的事實是由ndk生成的二進制文件與目標平臺不兼容(32位錯誤,語法錯誤)。 –