我想要的是使用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'
}
}
答案 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();
}