Link 外部共享库 android ndk
Link external shared library android ndk
我已经使用 android-ndk 工具链(预构建的 llvm)构建了 python3,我正在尝试 link 针对我在 android 工作室中的项目。构建完成时没有错误,但是当我启动应用程序时出现此错误:
28926-28926/com.e.python3 E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.e.python3, PID: 28926
java.lang.UnsatisfiedLinkError: dlopen failed: library "/home/user/AndroidStudioProjects/Python3/app/src/main/cpp/../jniLibs/x86/libpython3.8.so" not found
at java.lang.Runtime.loadLibrary0(Runtime.java:1016)
at java.lang.System.loadLibrary(System.java:1657)
at com.e.python3.MainActivity.<clinit>(MainActivity.java:12)
...
我在该主题上发现的其他线程与将 lib 导出到 apk 有关,但在我的情况下,apk 在 lib 目录中具有 lib(我可以通过 adb 或使用 apk 分析器查看它)。
我遵循了指南:https://developer.android.com/studio/projects/configure-cmake
这是我的 CMakeLists.txt:
cmake_minimum_required(VERSION 3.4.1)
add_library( # Sets the name of the library.
native-lib
SHARED
native-lib.cpp)
find_library(
log-lib
log)
include_directories(
/home/user/PythonBuild/python390.${CMAKE_ANDROID_ARCH_ABI}/include/python3.8
)
add_library(python3 SHARED IMPORTED)
set_target_properties(python3 PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/../jniLibs/${CMAKE_ANDROID_ARCH_ABI}/libpython3.8.so)
target_link_libraries(
native-lib
python3
${log-lib})
还有我的 gradle:
apply plugin: 'com.android.application'
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.e.python3"
minSdkVersion 23
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
cppFlags ""
}
}
ndk {
moduleName "jnilib"
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
externalNativeBuild {
cmake {
path "src/main/cpp/CMakeLists.txt"
version "3.10.2"
}
}
splits {
abi {
enable true
reset()
include 'x86_64', 'armeabi-v7a', 'arm64-v8a', 'x86'
universalApk false
}
}
sourceSets {
main {
jniLibs.srcDirs = ['src/main/jniLibs']
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
奇怪的是,它试图使用构建它的计算机的路径打开共享库,而不是 apk 之一。
我在那里找到了答案:
Using a prebuilt shared Library in Android Studio (cmake)感谢@Michael
我在编译 python 时更改了 INSTSONAME 以丢弃库的版本化部分 (libpython3.8.so.1.0 -> libpython3。 8.so)。这样做也会丢弃 SONAME。
使用 patchelf 我能够添加 SONAME 并且找到了库。
我已经使用 android-ndk 工具链(预构建的 llvm)构建了 python3,我正在尝试 link 针对我在 android 工作室中的项目。构建完成时没有错误,但是当我启动应用程序时出现此错误:
28926-28926/com.e.python3 E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.e.python3, PID: 28926
java.lang.UnsatisfiedLinkError: dlopen failed: library "/home/user/AndroidStudioProjects/Python3/app/src/main/cpp/../jniLibs/x86/libpython3.8.so" not found
at java.lang.Runtime.loadLibrary0(Runtime.java:1016)
at java.lang.System.loadLibrary(System.java:1657)
at com.e.python3.MainActivity.<clinit>(MainActivity.java:12)
...
我在该主题上发现的其他线程与将 lib 导出到 apk 有关,但在我的情况下,apk 在 lib 目录中具有 lib(我可以通过 adb 或使用 apk 分析器查看它)。
我遵循了指南:https://developer.android.com/studio/projects/configure-cmake
这是我的 CMakeLists.txt:
cmake_minimum_required(VERSION 3.4.1)
add_library( # Sets the name of the library.
native-lib
SHARED
native-lib.cpp)
find_library(
log-lib
log)
include_directories(
/home/user/PythonBuild/python390.${CMAKE_ANDROID_ARCH_ABI}/include/python3.8
)
add_library(python3 SHARED IMPORTED)
set_target_properties(python3 PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/../jniLibs/${CMAKE_ANDROID_ARCH_ABI}/libpython3.8.so)
target_link_libraries(
native-lib
python3
${log-lib})
还有我的 gradle:
apply plugin: 'com.android.application'
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.e.python3"
minSdkVersion 23
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
cppFlags ""
}
}
ndk {
moduleName "jnilib"
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
externalNativeBuild {
cmake {
path "src/main/cpp/CMakeLists.txt"
version "3.10.2"
}
}
splits {
abi {
enable true
reset()
include 'x86_64', 'armeabi-v7a', 'arm64-v8a', 'x86'
universalApk false
}
}
sourceSets {
main {
jniLibs.srcDirs = ['src/main/jniLibs']
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
奇怪的是,它试图使用构建它的计算机的路径打开共享库,而不是 apk 之一。
我在那里找到了答案: Using a prebuilt shared Library in Android Studio (cmake)感谢@Michael
我在编译 python 时更改了 INSTSONAME 以丢弃库的版本化部分 (libpython3.8.so.1.0 -> libpython3。 8.so)。这样做也会丢弃 SONAME。 使用 patchelf 我能够添加 SONAME 并且找到了库。