如何告诉工具链设备?为了在C中构建本机应用程序

时间:2018-02-02 15:37:45

标签: android android-ndk toolchain

我在C中有一个共享库。我想在我的Android设备上编译并运行一个测试应用程序。 至于我的理解,这就是我认为我必须做的事情:

  1. 使用其工具链交叉编译arm设备的库
  2. 创建一个android.mk文件并使用NDK编译(我按照以下链接:build-cc-executables-for-android-using-ndk
  3. 我修改了android.mk文件以添加共享库

    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS) 
    # give module name
    LOCAL_MODULE    := depend1
    LOCAL_SRC_FILES := libdepend1.so 
    include $(PREBUILT_SHARED_LIBRARY)
    
    include $(CLEAR_VARS) 
    # give module name
    LOCAL_MODULE    := depend2
    LOCAL_SRC_FILES := libdepend2.so 
    include $(PREBUILT_SHARED_LIBRARY)
    
    include $(CLEAR_VARS) 
    # give module name
    LOCAL_MODULE    := test
    # list your C files to compile
    LOCAL_SRC_FILES := test.c
    # this option will build executables instead of building library   
    include $(BUILD_EXECUTABLE)
    

    项目编译。我在libs文件夹中获取了我的可执行文件。

    使用adb在android shell上运行可执行文件时出现以下错误:

    Init: Error opening /data/local/project/depend1.so:  dlopen failed: could not load library "depend2.so" needed by "depend1.so"; caused by could not load library "libgcc_s.so.1" needed by "depend2.so"; caused by library "libgcc_s.so.1" not found
    

    (注意: dlopen 是我代码的一部分)

    它无法找到属于工具链的库,我没有在设备的/ system / lib中找到这个库,这引出了我的第一个问题 - 我使用的是正确的工具链(我使用过的工具链)是 arm-none-linux-gnueabi ) 其次,我是否正确为Android构建它?

1 个答案:

答案 0 :(得分:0)

这个库使用Cmake还是automake?

对于Cmake,您只需要对其进行适当的处​​理(how to

示例:cmake -DANDROID_NDK=path/to/ndk -DCMAKE_TOOLCHAIN_FILE=$NDK/build/cmake/android.toolchain.cmake --DANDROID_ABI=armeabi-v7a -DANDROID_PLATFORM=android-21 ..

对于automake,您应该使用预构建的GCC工具链(但在NDK中弃用GCC)或创建新的独立工具链(how to

此工具链对于Android的交叉编译100%有效

如果你仍想使用ndk-build,你可以阅读link(我不使用它,所以我只能通过Cmake和automake进一步帮助)