我想在android-ndk hello-libs示例中添加另一个库。
在TEXTBOX
中,我添加:
CMakeLists.txt
这:
# this is from the hello-libs sample code
add_library(lib_gperf SHARED IMPORTED)
set_target_properties(lib_gperf PROPERTIES IMPORTED_LOCATION
${distribution_DIR}/gperf/lib/${ANDROID_ABI}/libgperf.so)
########## I add this after the sample code: ###########
add_library(lib_py SHARED IMPORTED)
set_target_properties(lib_py PROPERTIES IMPORTED_LOCATION
${distribution_DIR}/gperf/lib/${ANDROID_ABI}/libpython.so)
并将target_link_libraries(
hello-libs
android
lib_gperf
#### this line ######
lib_py
log)
复制到libpython.so
所在的目录中:
还将python标头复制到包含目录中:
当我点击运行按钮时:
libgperf.so
该路径存在于我的计算机中,但是为什么apk使用我的计算机路径而不是android设备路径?
然后我使用Android设备文件浏览器,该lib位于目录中:
那我该如何使apk使用正确的路径?
还是我错过了要添加的内容?
答案 0 :(得分:1)
我遇到了完全相同的问题,我发现在构建.so文件时,python库的库链接错误,而gperf库的链接还可以。
这两个库都在cmake中以完全相同的方法导入,因此没有意义。
我的一个朋友告诉我这是忍者的一个bug,并提供了“周转”解决方案。您必须导入python库,就好像它是Android-NDK提供的库一样(如Android或Log)
删除为lib_py添加的代码,并将target_link_library更改为
target_link_libraries(
hello-libs
android
lib_gperf
python //The name of the library libpython.so
log
)
您仍然需要提供标题
target_include_directories( pyjni PRIVATE ${python_DIR}/include )
刷新C文件并尝试进行编译。 首次尝试时,它将告诉您编译器无法在特定位置找到python库。转到该位置并添加您的图书馆
就我而言
链接C共享库[...] D:/Android/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/lib/gcc/aarch64-linux-android/4.9.x /../../../../ aarch64-linux-android / bin \ ld:找不到-lpython
将libpython.so文件添加到指定位置,在我的情况下为D:/Android/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/lib/gcc/aarch64-linux-android/4.9.x/然后重新编译。
在我的情况下,它应该可以工作,您可以看到该链接现在只是libpython.so(在这种情况下,删除了libgperf.so)
Resulting library link in .so file
请注意,就我而言,我仅针对arm64-v8a进行编译。我现在不知道它是否可以与多个ABI一起使用。
显然,这不是一个好的解决方案。希望我的回答会引起更多关注,并且有人会提供一个真正的解决方案来避免此类调整
答案 1 :(得分:0)
假设路径/Users/finn/Downloads/hello-libs/app/src/main/cpp/../../../../distribution/gperf/lib
是正确的,那么您可以像下面这样配置您的JNI库:
sourceSets {
release {
jniLibs.srcDirs += ["/Users/finn/Downloads/hello-libs/app/src/main/cpp/../../../../distribution/gperf/lib"]
}
debug {
jniLibs.srcDirs += ["/Users/finn/Downloads/hello-libs/app/src/main/cpp/../../../../distribution/gperf/lib"]
}
}
如果它不是通往jni库的正确路径,请尝试更改/Users/finn/Downloads/hello-libs/app/src/main/cpp/../../../../distribution/gperf/lib
。