如何将静态库链接到NDK Android Build中用作本机库的源

时间:2019-05-27 02:11:56

标签: java cmake android-ndk

我想包括一个为提供的C ++代码构建的静态库,我尝试链接静态库,但是构建无法链接该库。我收到以下错误:

  

对“ Test_C_Interface”的未定义引用

我是Java NDK / cmake的新手。请帮助我

这是使用的cpp代码(native-lib.cpp)

    extern int Test_C_Interface();

    extern "C" JNIEXPORT jstring JNICALL

    Java_com_example_tvgui_MainActivity_stringFromJNI(JNIEnv *env, jobject /* this */) {
        std::string hello = "From C++";

        int ret_val;

        ret_val = Test_C_Interface();

        if(ret_val == 100){
            hello = "From C";
        }
       return env->NewStringUTF(hello.c_str());
    }

这是用于创建静态库的c代码(sample.c / libsample.a)[使用其他ToolChain构建的库]

    #include<stdio.h>

    int Test_C_Interface(void)
    {
        printf("Inside C Library\n");

        return 100;
    }

这是cmake文件

    cmake_minimum_required(VERSION 3.4.1)

    add_library(
            native-lib
            SHARED
            native-lib.cpp)

    find_library( 
            log-lib
            log)

    target_link_libraries(
            native-lib
            ${log-lib}
            ${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/libsample.a)

我需要通过以下方式构建应用程序:

libsample.a
             \
              \
                ====libnative-lib.so + Java = .apk 
              /
             /
native-lib.cpp

3 个答案:

答案 0 :(得分:0)

您应根据自己的ABI将libsample.a放入以下结构的目录中,例如

libs
│   ├── x86/libsample.a
│   ├── x86_64/libsample.a
│   ├── arm64-v8a/libsample.a
│   ├── armeabi-v7a/libsample.a

然后按如下所示更新cmakefile:

target_link_libraries(
            native-lib
            ${log-lib}
            ${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/<ANDROID_ABI>/libsample.a)

请确保${CMAKE_CURRENT_SOURCE_DIR}/../../../libs是正确的路径。

对于CMake变量,例如ANDROID_ABI,您可以参考Android NDK path variable in CMake build tool chain

答案 1 :(得分:0)

您可以使用android-ndk示例作为示例(以下示例)。这是link至android开发人员手册-Native libraries的说明。这是堆栈上的一个相同问题-link

在ubuntu上,静态/共享库的路径在此处(以android-ndk为例):

  

hello-jni / app / src / main / jniLibs / [处理器] / [您的库]

[Including a library, java file]

static {
        System.loadLibrary("hello-jni");
}

[Cmake file]

cmake_minimum_required(VERSION 3.4.1)

add_library(hello-jni SHARED
            hello-jni.c)

#Include libraries needed for hello-jni lib
target_link_libraries(hello-jni
                      android
                      log)

答案 2 :(得分:0)

我能够使用2条不同的工具链来构建.apk,对于静态库,我使用了基于ARM的外部工具链,对于NDK,我使用了ARMv7a ABI。我能够做一个工作的apk。唯一的错误是:

extern int Test_C_Interface(); --> extern "C"{ int Test_C_Interface();}