java.lang.UnsatisfiedLinkError: dlopen failed 64-bit instead of 32-bit while .so should be built in x86
java.lang.UnsatisfiedLinkError: dlopen failed 64-bit instead of 32-bit while .so should be built in x86
我正在尝试在 Android Studio 中使用 JNI,
我在默认情况下由Android Studio创建的示例native-lib.cpp下添加了JNI函数(添加C++支持后)
但是,我遇到了一个错误
java.lang.UnsatisfiedLinkError: No implementation found for boolean
com.example.user.project.Tracker.isTracking_0(boolean)
(tried
Java_com_example_user_project_Tracker_isTracking_10 and
Java_com_example_user_project_Tracker_isTracking_10__Z)
我也试过将它添加到 MainActivity
static {
System.loadLibrary("tracker");
}
但我会得到另一个例外
java.lang.UnsatisfiedLinkError: dlopen failed:
"/data/app/com.example.user.project/lib/x86/libtracker.so"
is 64-bit instead of 32-bit
可以看到我的库已经构建成功,这是构建时显示的曲目信息
Build tracker x86 [1/5] Building CXX object
CMakeFiles/tracker.dir/src/main/cpp/fhog.cpp.o [2/5] Building CXX
object CMakeFiles/tracker.dir/src/main/cpp/tracker.cpp.o [3/5]
Building CXX object
CMakeFiles/tracker.dir/src/main/cpp/ctracker.cpp.o [4/5] Building
CXX object CMakeFiles/tracker.dir/src/main/cpp/native-lib.cpp.o [5/5]
Linking CXX shared library
../../../../build/intermediates/cmake/debug/obj/x86/libtracker.so
Build tracker mips [1/5] Building CXX object
CMakeFiles/tracker.dir/src/main/cpp/tracker.cpp.o [2/5] Building
CXX object CMakeFiles/tracker.dir/src/main/cpp/fhog.cpp.o [3/5]
Building CXX object
CMakeFiles/tracker.dir/src/main/cpp/ctracker.cpp.o [4/5] Building
CXX object CMakeFiles/tracker.dir/src/main/cpp/native-lib.cpp.o [5/5]
Linking CXX shared library
../../../../build/intermediates/cmake/debug/obj/mips/libtracker.so
Build tracker x86_64 [1/5] Building CXX object
CMakeFiles/tracker.dir/src/main/cpp/tracker.cpp.o [2/5] Building
CXX object CMakeFiles/tracker.dir/src/main/cpp/fhog.cpp.o [3/5]
Building CXX object
CMakeFiles/tracker.dir/src/main/cpp/ctracker.cpp.o [4/5] Building
CXX object CMakeFiles/tracker.dir/src/main/cpp/native-lib.cpp.o [5/5]
Linking CXX shared library
../../../../build/intermediates/cmake/debug/obj/x86_64/libtracker.so
Build tracker armeabi [1/5] Building CXX object
CMakeFiles/tracker.dir/src/main/cpp/tracker.cpp.o [2/5] Building
CXX object CMakeFiles/tracker.dir/src/main/cpp/fhog.cpp.o [3/5]
Building CXX object
CMakeFiles/tracker.dir/src/main/cpp/ctracker.cpp.o [4/5] Building
CXX object CMakeFiles/tracker.dir/src/main/cpp/native-lib.cpp.o [5/5]
Linking CXX shared library
../../../../build/intermediates/cmake/debug/obj/armeabi/libtracker.so
Build tracker armeabi-v7a [1/5] Building CXX object
CMakeFiles/tracker.dir/src/main/cpp/tracker.cpp.o [2/5] Building
CXX object CMakeFiles/tracker.dir/src/main/cpp/fhog.cpp.o [3/5]
Building CXX object
CMakeFiles/tracker.dir/src/main/cpp/ctracker.cpp.o [4/5] Building
CXX object CMakeFiles/tracker.dir/src/main/cpp/native-lib.cpp.o [5/5]
Linking CXX shared library
../../../../build/intermediates/cmake/debug/obj/armeabi-v7a/libtracker.so
这是我的 CMakeLists
set (pathToOpenCv /home/user/OpenCV-android-sdk3.2)
set (pathToProject /home/user/AndroidStudioProjects/project)
cmake_minimum_required(VERSION 3.4.1)
set(CMAKE_VERBOSE_MAKEFILE on)
include_directories(${pathToOpenCv}/sdk/native/jni/include)
FILE(GLOB_RECURSE cppfiles "src/main/cpp/*.cpp")
add_library(lib_opencv SHARED IMPORTED)
add_library(tracker SHARED ${cppfiles})
set_target_properties(lib_opencv PROPERTIES IMPORTED_LOCATION ${pathToProject}/app/src/main/jniLibs/${ANDROID_ABI}/libopencv_java3.so)
find_library(
log-lib
log )
target_link_libraries( tracker
${log-lib}
lib_opencv
)
这是我的 native-lib.cpp
#include <jni.h>
#include <string>
extern "C"
JNIEXPORT jboolean JNICALL Java_com_example_user_project_Tracker_isTracking_10
(JNIEnv *env, jboolean boolean) {
printf("\n c-boolean: %d ", boolean);
if (boolean == JNI_TRUE) {
printf("true");
} else {
printf("false");
}
boolean = false;
return boolean;
};
那么Android工作室在我的.so库中找不到方法,出现java.lang.UnsatisfiedLinkError是什么原因呢?另外,我不明白为什么我的 x86 库是 64 位而不是 32 位。
谢谢
更新
仔细检查 android 日志,我认为它没有正确加载跟踪器库。我认为现在 64 位错误是主要问题。更新问题标题
java.lang.UnsatisfiedLinkError: dlopen failed:
"/data/app/com.example.user.project/lib/x86/libtracker.so"
is 64-bit instead of 32-bit
在build.gradle
我已经设置了 abiFilter,我的 AVD 是 x86 设备
应用插件:'com.android.application'
android {
compileSdkVersion 26
buildToolsVersion "26.0.1"
defaultConfig {
applicationId "com.example.user.project"
minSdkVersion 23
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
cppFlags ""
}
}
}
sourceSets.main {
jniLibs.srcDir 'src/main/jniLibs'
jni.srcDirs = []
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
defaultConfig {
ndk {
abiFilters "armeabi", "armeabi-v7a", "x86", "x86_64", "mips"
}
}
}
// call regular ndk-build(.cmd) script from app directory
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:26.+'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
compile project(':openCVLibrary320')
}
这是导致您出现问题的原因:
sourceSets.main {
jniLibs.srcDir 'src/main/jniLibs'
jni.srcDirs = []
}
这些定义不能与 externalNativeBuild 安全共存。
基本上,在新的 Android Studio 中,jni.srcDirs 是不相关的。它通过分析您的 cmake 或 ndk-build 日志来查找要使用的 C/++ 文件。但即使您使用 externalNativeBuild,AS 也会将它在 jniLibs 中找到的二进制文件复制到最终的 APK。 libtracker.so 的错误版本不知何故卡在了 src/main/jniLibs/x86 目录中。重要的是要记住构建或重建通常不会在那里 remove/update 二进制文件。
我正在尝试在 Android Studio 中使用 JNI, 我在默认情况下由Android Studio创建的示例native-lib.cpp下添加了JNI函数(添加C++支持后)
但是,我遇到了一个错误
java.lang.UnsatisfiedLinkError: No implementation found for boolean com.example.user.project.Tracker.isTracking_0(boolean) (tried Java_com_example_user_project_Tracker_isTracking_10 and Java_com_example_user_project_Tracker_isTracking_10__Z)
我也试过将它添加到 MainActivity
static {
System.loadLibrary("tracker");
}
但我会得到另一个例外
java.lang.UnsatisfiedLinkError: dlopen failed: "/data/app/com.example.user.project/lib/x86/libtracker.so" is 64-bit instead of 32-bit
可以看到我的库已经构建成功,这是构建时显示的曲目信息
Build tracker x86 [1/5] Building CXX object CMakeFiles/tracker.dir/src/main/cpp/fhog.cpp.o [2/5] Building CXX object CMakeFiles/tracker.dir/src/main/cpp/tracker.cpp.o [3/5] Building CXX object CMakeFiles/tracker.dir/src/main/cpp/ctracker.cpp.o [4/5] Building CXX object CMakeFiles/tracker.dir/src/main/cpp/native-lib.cpp.o [5/5] Linking CXX shared library ../../../../build/intermediates/cmake/debug/obj/x86/libtracker.so Build tracker mips [1/5] Building CXX object CMakeFiles/tracker.dir/src/main/cpp/tracker.cpp.o [2/5] Building CXX object CMakeFiles/tracker.dir/src/main/cpp/fhog.cpp.o [3/5] Building CXX object CMakeFiles/tracker.dir/src/main/cpp/ctracker.cpp.o [4/5] Building CXX object CMakeFiles/tracker.dir/src/main/cpp/native-lib.cpp.o [5/5] Linking CXX shared library ../../../../build/intermediates/cmake/debug/obj/mips/libtracker.so Build tracker x86_64 [1/5] Building CXX object CMakeFiles/tracker.dir/src/main/cpp/tracker.cpp.o [2/5] Building CXX object CMakeFiles/tracker.dir/src/main/cpp/fhog.cpp.o [3/5] Building CXX object CMakeFiles/tracker.dir/src/main/cpp/ctracker.cpp.o [4/5] Building CXX object CMakeFiles/tracker.dir/src/main/cpp/native-lib.cpp.o [5/5] Linking CXX shared library ../../../../build/intermediates/cmake/debug/obj/x86_64/libtracker.so Build tracker armeabi [1/5] Building CXX object CMakeFiles/tracker.dir/src/main/cpp/tracker.cpp.o [2/5] Building CXX object CMakeFiles/tracker.dir/src/main/cpp/fhog.cpp.o [3/5] Building CXX object CMakeFiles/tracker.dir/src/main/cpp/ctracker.cpp.o [4/5] Building CXX object CMakeFiles/tracker.dir/src/main/cpp/native-lib.cpp.o [5/5] Linking CXX shared library ../../../../build/intermediates/cmake/debug/obj/armeabi/libtracker.so Build tracker armeabi-v7a [1/5] Building CXX object CMakeFiles/tracker.dir/src/main/cpp/tracker.cpp.o [2/5] Building CXX object CMakeFiles/tracker.dir/src/main/cpp/fhog.cpp.o [3/5] Building CXX object CMakeFiles/tracker.dir/src/main/cpp/ctracker.cpp.o [4/5] Building CXX object CMakeFiles/tracker.dir/src/main/cpp/native-lib.cpp.o [5/5] Linking CXX shared library ../../../../build/intermediates/cmake/debug/obj/armeabi-v7a/libtracker.so
这是我的 CMakeLists
set (pathToOpenCv /home/user/OpenCV-android-sdk3.2)
set (pathToProject /home/user/AndroidStudioProjects/project)
cmake_minimum_required(VERSION 3.4.1)
set(CMAKE_VERBOSE_MAKEFILE on)
include_directories(${pathToOpenCv}/sdk/native/jni/include)
FILE(GLOB_RECURSE cppfiles "src/main/cpp/*.cpp")
add_library(lib_opencv SHARED IMPORTED)
add_library(tracker SHARED ${cppfiles})
set_target_properties(lib_opencv PROPERTIES IMPORTED_LOCATION ${pathToProject}/app/src/main/jniLibs/${ANDROID_ABI}/libopencv_java3.so)
find_library(
log-lib
log )
target_link_libraries( tracker
${log-lib}
lib_opencv
)
这是我的 native-lib.cpp
#include <jni.h>
#include <string>
extern "C"
JNIEXPORT jboolean JNICALL Java_com_example_user_project_Tracker_isTracking_10
(JNIEnv *env, jboolean boolean) {
printf("\n c-boolean: %d ", boolean);
if (boolean == JNI_TRUE) {
printf("true");
} else {
printf("false");
}
boolean = false;
return boolean;
};
那么Android工作室在我的.so库中找不到方法,出现java.lang.UnsatisfiedLinkError是什么原因呢?另外,我不明白为什么我的 x86 库是 64 位而不是 32 位。
谢谢
更新
仔细检查 android 日志,我认为它没有正确加载跟踪器库。我认为现在 64 位错误是主要问题。更新问题标题
java.lang.UnsatisfiedLinkError: dlopen failed: "/data/app/com.example.user.project/lib/x86/libtracker.so" is 64-bit instead of 32-bit
在build.gradle 我已经设置了 abiFilter,我的 AVD 是 x86 设备
应用插件:'com.android.application'
android {
compileSdkVersion 26
buildToolsVersion "26.0.1"
defaultConfig {
applicationId "com.example.user.project"
minSdkVersion 23
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
cppFlags ""
}
}
}
sourceSets.main {
jniLibs.srcDir 'src/main/jniLibs'
jni.srcDirs = []
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
defaultConfig {
ndk {
abiFilters "armeabi", "armeabi-v7a", "x86", "x86_64", "mips"
}
}
}
// call regular ndk-build(.cmd) script from app directory
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:26.+'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
compile project(':openCVLibrary320')
}
这是导致您出现问题的原因:
sourceSets.main {
jniLibs.srcDir 'src/main/jniLibs'
jni.srcDirs = []
}
这些定义不能与 externalNativeBuild 安全共存。
基本上,在新的 Android Studio 中,jni.srcDirs 是不相关的。它通过分析您的 cmake 或 ndk-build 日志来查找要使用的 C/++ 文件。但即使您使用 externalNativeBuild,AS 也会将它在 jniLibs 中找到的二进制文件复制到最终的 APK。 libtracker.so 的错误版本不知何故卡在了 src/main/jniLibs/x86 目录中。重要的是要记住构建或重建通常不会在那里 remove/update 二进制文件。