【问题标题】:Cmake, Android: call static function defined inside a pre-built libraryCmake,Android:调用在预建库中定义的静态函数
【发布时间】: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


【解决方案1】:

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

target_link_libraries(native-lib library)

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

【讨论】:

    猜你喜欢
    • 2018-10-05
    • 1970-01-01
    • 2017-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    相关资源
    最近更新 更多