【发布时间】:2017-03-17 10:35:43
【问题描述】:
如何调用在预构建库 (library.so) 中定义/实现的静态函数。
定义如下:
namespace MyNS {
class Database {
public:
static void logDB();
};
}
library.so 没有提供头文件,但函数的签名是已知的。
我创建了我的标题并在其中添加了上述定义,然后我将它包含在我的源文件中并尝试调用该函数:
#include "Database.h"
JNIEXPORT jstring JNICALL Java_com_my_package_name_MyClass_stringFromJNI(JNIEnv *env, jobject instance) {
MyNS::Database::logDB();//compilation error
return env->NewStringUTF("test");
}
我收到undefined reference to MyNS::Database::logDB()' 错误,可能是因为缺少函数实现。
我想应该有办法将该标头链接到实现该功能的库?
这是我的 CMakeLists.txt:
cmake_minimum_required(VERSION 3.4.1)
add_library( native-lib
SHARED
src/cpp/my_src.cpp )
# Include libraries needed for hello-jni lib
target_link_libraries(native-lib
android
log)
# Specifies a path to native header files.
include_directories(src/cpp/)
#add pre-built library
add_library( library
SHARED
IMPORTED)
set_target_properties( # Specifies the target library.
library
# Specifies the parameter you want to define.
PROPERTIES IMPORTED_LOCATION
# Provides the path to the library you want to import.
/path/to/lib/library.so )
include_directories(/path/to/lib/)
【问题讨论】:
-
如何将您的库与预建库链接?这样你就可以告诉编译器在哪里找到函数定义。
-
我会验证 library.so 是否具有您要查找的符号(例如,在其上添加
objdump -t)。
标签: android c++ android-ndk cmake java-native-interface