【发布时间】:2016-05-13 11:08:54
【问题描述】:
我有一个要在 Android 上启动的 C 项目。
我使用 NDK 编译了项目,生成了二进制文件并将其嵌入到应用程序中以启动它。
该项目使用自动工具,我使用androgenizer 来生成和适配Android.mks。
它也使用openssl,所以我按照this为android编译它,二进制使用编译的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
标准输出给了我二进制文件的语法错误:
/data/data/com.myproject.mybin/files/mybin[1]: syntax error: ' 4 4' unexpected
当我尝试从 adb shell 启动二进制文件时,得到了那个错误
root@generic_x86:/data/user/0/com.myproject/files # ./mybin
/system/bin/sh: ./mybin: not executable: 32-bit ELF file
我在十六进制编辑器中打开mybin,语法错误出现在库/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 Studio : 2.1
- SDK:r24.4.1
-
mybin(ndk) 在 Linux 上编译,apk (Android Studio) 在 Windows 上编译
【问题讨论】:
标签: android c android-ndk