java - 如何将静态库链接到在 NDK Android Build 中用作 native 库的源

标签 java c++ cmake android-ndk

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

undefined reference to '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)[使用NDK ARM-v7a 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

更新 问题已通过修改代码解决,如下所示:

extern "C"{ 
     int Test_C_Interface();
}

最佳答案

您应该根据您的 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

关于java - 如何将静态库链接到在 NDK Android Build 中用作 native 库的源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56318899/

相关文章:

java - 使用 trustStore 时 HTTPS 证书验证失败

c++ - 集合类型的可变长度参数列表

android - 意外的 e_type : 1 Linking release library using JNI + CMake + Android. mk

c++ - CMake:隐藏 -WShadow 子目标的全局编译标志

android - 使用 Android NDK 通过 CMake 构建共享库时遇到问题

java - 参数化类和方法 : making a method returns a correct type with java generics

java - 访问共享目录

java - 如何发现隐式多重根

c++ - 了解场景图和图边

c++ - 带锁的指令重排序