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

How can I link a static library to a source used as an native library in NDK Android Build

本文关键字:本机 构建 NDK 静态 链接 Android      更新时间:2023-10-16

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

未定义的引用'test_c_interface'

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

这是使用的CPP代码(本机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代码(sampal.c/libsample.a([使用NDK ARM-V7A工具链构建的库]

    #include<stdio.h>
    int Test_C_Interface(void)
    {
        printf("Inside C Libraryn");
        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)

我需要从like构建一个应用程序:

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,您可以参考CMake Build wool链中的Android NDK路径变量

您可以将Android-NDK样本作为示例(下面的示例(。这是指向Android Dev手册的链接 - 对本地库的解释。这是堆栈上的一个问题 - 链接。

在Ubuntu上,静态/共享库的路径在这里(这是Android-ndk示例(:

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

[包括库,java文件]

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)