Cmake,Android:在预建库中定义的调用静态函数

时间:2017-03-17 10:35:44

标签: android c++ android-ndk cmake java-native-interface

如何调用在预构建的库(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/)

1 个答案:

答案 0 :(得分:0)

您需要将导入的库与正在构建的库链接起来。只需将它放在CMakeLists.txt的末尾:

target_link_libraries(native-lib library)

听起来你已经正确设置了标题。