使用CMAKE生成可执行的NDK:未找到动态库错误

时间:2018-12-15 16:25:14

标签: gradle cmake android-ndk

我想要的是使用NDK构建本机二进制文件。还有夫妻共享库也已经建立。 APK结构如下:

/data/data/mypackage/files/my_binary
/data/data/mypackage/lib/liba.so
/data/data/mypackage/lib/libb.so

执行二进制文件时,抛出了诸如CANNOT LINK EXECUTABLE: could not load library "liba.so" needed by "./mybinay"; caused by library liba.so not found之类的错误。将LD_LIBRARY_PATH设置为/data/data/mypackage/lib后,它可以正常工作。

我的问题是如何在不将CMAKE文件或Gradel中设置LD_LIBRARY_PATH的情况下使其工作?

Cmake文件。

add_library(a, src/a.cc)
add_library(b, src/b.cc)
add_executable(mybinary src/mybinary.cc)
target_link_libraries(a log)
target_link_libraries(mybinary a android log b)

成绩文件。

externalNativeBuild {
    cmake {
        cppFlags "-std=c++14 -frtti -fexceptions"
        targets 'mybinary','a','b'
    }
}

1 个答案:

答案 0 :(得分:1)

运行时场景与CMake或gradle不相关。您不需要 LD_LIBRARY_PATH 构建可执行文件。

我更喜欢将可执行文件打包到APK的libs/中,紧挨 liba.so libb.so 。诀窍是将 my_binary 重命名为类似 libmy_binary.so 的名称(请参见https://stackoverflow.com/a/15099666/192373)。

因此,这意味着现在 CMakeLists.txt 可以如下所示:

add_library(a, src/a.cc)
add_library(b, src/b.cc)
add_executable(mybinary src/mybinary.cc)
target_link_libraries(a log)
target_link_libraries(lib.mybinary.so a android log b)

设置 LD_LIBRARY_PATH 很简单:

try {
    Runtime.getRuntime().exec(
        getApplicationInfo().nativeLibraryDir + "/lib.mybinary.so", 
        new String[]{"LD_LIBRARY_PATH="+ getApplicationInfo().nativeLibraryDir});
} catch (IOException e) {
    e.printStackTrace();
}