【问题标题】:How to execute obj file on Android如何在Android上执行obj文件
【发布时间】:2014-03-26 09:02:27
【问题描述】:

我有想要在 Android 库上执行的 C 代码。

我在 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) 里面有一些编译器,不知道该用哪一个。

【问题讨论】:

  • 这不是为 Android 构建的正确方法。您应该遵循 NDK 文档并使用带有 ndk-build 的 Android.mk 来构建可执行文件,或者更符合 NDK 的意图,从 Java 应用程序调用的 jni 共享库。您还可以按照说明创建独立的工具链并与现有的项目构建系统一起使用,但这很棘手。

标签: android c android-ndk adb


【解决方案1】:

根本不可能执行一个简单的目标文件,因为它错过了正确运行的重要信息(这绝不限于 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。

【讨论】:

    猜你喜欢
    • 2020-05-27
    • 2015-08-12
    • 1970-01-01
    • 2012-01-02
    • 2012-01-12
    • 1970-01-01
    • 2020-04-06
    • 2019-04-27
    • 2019-06-23
    相关资源
    最近更新 更多