我有C代码,我想在Android的库上执行。
我在Windows中用NDK
编译了这段代码,就像那样:
set SYSROOT=%NDK%\platforms\android-17\arch-arm
cd %NDK%/toolchains/arm-linux-androideabi-4.6\prebuilt\windows-x86_64\bin
arm-linux-androideabi-gcc.exe --sysroot=%SYSROOT% -c "C:\main.c" -o "C:\main.o"
然后我按adb
:
adb push C:\main.o /data/local/tmp
adb shell chmod 777 /data/local/tmp/main.o
之后我尝试执行此文件:
adb shell /data/local/tmp/main.o
但我收到以下错误:
[Android] not executable: magic=7F45
所以我尝试通过以下代码通过Android应用程序执行:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent();
intent.setAction(android.content.Intent.ACTION_VIEW);
String fileName="/data/local/tmp/main.o";
File file = new File(fileName);
//get file type
MimeTypeMap mime = MimeTypeMap.getSingleton();
String ext = file.getName().substring(file.getName().indexOf(".")+1);
String type = mime.getMimeTypeFromExtension(ext);
//run
intent.setDataAndType(Uri.fromFile(file), type);
startActivity(intent);
}
但是当我尝试运行我的应用程序时,它关闭了,我收到了消息:
unfortunately, myApplication has stopped
任何人都可以帮助我吗?
修改
我认为编译与我的Android机器不匹配。如何找到针对特定Android版本需要编译的gcc
?在NDK(%NDK%\toolchains
)中有一些编译器,我不知道如何决定我需要使用哪一个。
答案 0 :(得分:0)
它根本无法执行简单的目标文件,因为它错过了重要的信息才能正常运行(这绝不仅限于Android,只是C / C ++编译的工作方式)。
您应该生成一个直接的可执行文件,例如:
1)为您的系统生成独立的工具链 2)使用/ path / to / arm-linux-androideabi-gcc -o main main.c 3)adb push main / data / local / tmp / 4)adb shell / data / local / tmp / main
如果您不想生成独立的工具链,则需要在直接调用NDK二进制文件时注意添加正确的命令行参数。坦率地说,我认为你写一个小的jni / Android.mk并调用ndk-build会更好。