gpt4 book ai didi

c++ - 链接外部共享库android ndk

转载 作者:行者123 更新时间:2023-12-03 05:27:54 24 4
gpt4 key购买 nike

我已经使用android-ndk工具链(预先构建的llvm)构建了python3,并且尝试在android studio中链接到我的项目。构建完成没有错误,但是当我启动应用程序时出现此错误:

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并找到该库。

关于c++ - 链接外部共享库android ndk,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60532473/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com