【问题标题】:java.lang.UnsatisfiedLinkError: dlopen failed 64-bit instead of 32-bit while .so should be built in x86java.lang.UnsatisfiedLinkError: dlopen 失败 64 位而不是 32 位,而 .so 应该在 x86 中构建
【发布时间】:2017-09-14 01:24:14
【问题描述】:

我正在尝试在 Android Studio 中使用 JNI, 我在Android Studio默认创建的示例native-lib.cpp下添加了JNI函数(添加C++支持后)

但是,我遇到了一个错误

java.lang.UnsatisfiedLinkError: 找不到布尔值的实现 com.example.user.project.Tracker.isTracking_0(布尔值) (试过 Java_com_example_user_project_Tracker_isTracking_10 和 Java_com_example_user_project_Tracker_isTracking_10__Z)

我也尝试将它添加到 MainActivity

static {
        System.loadLibrary("tracker");
   }

但我会得到另一个例外

java.lang.UnsatisfiedLinkError:dlopen 失败: “/data/app/com.example.user.project/lib/x86/libtracker.so” 是 64 位而不是 32 位

我可以看到我的库已经构建成功,这是构建时显示的跟踪消息

构建跟踪器 x86 [1/5] 构建 CXX 对象 CMakeFiles/tracker.dir/src/main/cpp/fhog.cpp.o [2/5] 构建 CXX 对象 CMakeFiles/tracker.dir/src/main/cpp/tracker.cpp.o [3/5] 构建 CXX 对象 CMakeFiles/tracker.dir/src/main/cpp/ctracker.cpp.o [4/5] 建设 CXX 对象 CMakeFiles/tracker.dir/src/main/cpp/native-lib.cpp.o [5/5] 链接 CXX 共享库 ../../../../build/intermediates/cmake/debug/obj/x86/libtracker.so 构建跟踪器 mips [1/5] 构建 CXX 对象 CMakeFiles/tracker.dir/src/main/cpp/tracker.cpp.o [2/5] 建设 CXX 对象 CMakeFiles/tracker.dir/src/main/cpp/fhog.cpp.o [3/5] 构建 CXX 对象 CMakeFiles/tracker.dir/src/main/cpp/ctracker.cpp.o [4/5] 建设 CXX 对象 CMakeFiles/tracker.dir/src/main/cpp/native-lib.cpp.o [5/5] 链接 CXX 共享库 ../../../../build/intermediates/cmake/debug/obj/mips/libtracker.so 构建跟踪器 x86_64 [1/5] 构建 CXX 对象 CMakeFiles/tracker.dir/src/main/cpp/tracker.cpp.o [2/5] 建设 CXX 对象 CMakeFiles/tracker.dir/src/main/cpp/fhog.cpp.o [3/5] 构建 CXX 对象 CMakeFiles/tracker.dir/src/main/cpp/ctracker.cpp.o [4/5] 建设 CXX 对象 CMakeFiles/tracker.dir/src/main/cpp/native-lib.cpp.o [5/5] 链接 CXX 共享库 ../../../../build/intermediates/cmake/debug/obj/x86_64/libtracker.so 构建跟踪器 armeabi [1/5] 构建 CXX 对象 CMakeFiles/tracker.dir/src/main/cpp/tracker.cpp.o [2/5] 建设 CXX 对象 CMakeFiles/tracker.dir/src/main/cpp/fhog.cpp.o [3/5] 构建 CXX 对象 CMakeFiles/tracker.dir/src/main/cpp/ctracker.cpp.o [4/5] 建设 CXX 对象 CMakeFiles/tracker.dir/src/main/cpp/native-lib.cpp.o [5/5] 链接 CXX 共享库 ../../../../build/intermediates/cmake/debug/obj/armeabi/libtracker.so 构建跟踪器 armeabi-v7a [1/5] 构建 CXX 对象 CMakeFiles/tracker.dir/src/main/cpp/tracker.cpp.o [2/5] 建设 CXX 对象 CMakeFiles/tracker.dir/src/main/cpp/fhog.cpp.o [3/5] 构建 CXX 对象 CMakeFiles/tracker.dir/src/main/cpp/ctracker.cpp.o [4/5] 建设 CXX 对象 CMakeFiles/tracker.dir/src/main/cpp/native-lib.cpp.o [5/5] 链接 CXX 共享库 ../../../../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 Studio 无法从我的 .so 库中找到该方法并出现 java.lang.UnsatisfiedLinkError 的原因是什么?另外,我不明白为什么我的 x86 库是 64 位而不是 32 位。

谢谢

更新

仔细检查android日志,我认为它没有正确加载跟踪器库。我认为现在 64 位错误是主要问题。更新问题标题

java.lang.UnsatisfiedLinkError:dlopen 失败: “/data/app/com.example.user.project/lib/x86/libtracker.so” 是 64 位而不是 32 位

在 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')
}

【问题讨论】:

  • 我最终在 Android Studio 上重新创建了新项目,解决了 64 位问题。但我仍然不明白是什么导致了 64 位而不是 32 位问题。

标签: java c++ android-studio java-native-interface


【解决方案1】:

这是导致您的问题的原因:

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 目录中。请务必记住,构建或重建通常不会删除/更新那里的二进制文件。

【讨论】:

  • 谢谢,所以我手动删除了 x86 文件夹中的 libtracker.so。再次构建,它现在可以工作了:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-03
  • 2016-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-13
  • 1970-01-01
相关资源
最近更新 更多