如何在Android上执行obj文件

时间:2014-03-26 09:02:27

标签: android c android-ndk adb

我有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

推送了.obj文件
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)中有一些编译器,我不知道如何决定我需要使用哪一个。

1 个答案:

答案 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会更好。