我想包含为提供的 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/