简体   繁体   English

java.lang.UnsatisfiedLinkError:dlopen在64位而不是32位上失败,而.so应该在x86中构建

[英]java.lang.UnsatisfiedLinkError: dlopen failed 64-bit instead of 32-bit while .so should be built in x86

I am trying to use JNI in Android Studio, I added the JNI function under the sample native-lib.cpp which created by Android Studio by default (after adding C++ support) 我正在尝试在Android Studio中使用JNI,我在默认情况下(添加C ++支持后)由Android Studio创建的示例native-lib.cpp下添加了JNI函数。

However, I am facing an error 但是,我遇到了一个错误

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) java.lang.UnsatisfiedLinkError:未找到布尔com.example.user.project.Tracker.isTracking_0(boolean)的实现(尝试过Java_com_example_user_project_Tracker_isTracking_10和Java_com_example_user_project_user_project_Tracker_isTracking_10__Z)

I also tried to add this to MainActivity 我也尝试将其添加到MainActivity

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

but I will get another exception 但我会得到另一个例外

java.lang.UnsatisfiedLinkError: dlopen failed: "/data/app/com.example.user.project/lib/x86/libtracker.so" is 64-bit instead of 32-bit java.lang.UnsatisfiedLinkError:dlopen失败:“ / data / app / com.example.user.project / lib / x86 / libtracker.so”是64位而不是32位

I can see that my library has been built successfully, this is the track message it shows when build 我可以看到我的库已成功构建,这是构建时显示的跟踪消息

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 构建跟踪器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] 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 /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] Linking CXX shared library ../../../../build/intermediates/cmake/debug/obj/armeabi-v7a/libtracker.so .dir / src / main / cpp / native-lib.cpp.o [5/5]链接CXX共享库../../../../build/intermediates/cmake/debug/obj/armeabi-v7a /libtracker.so

This is my CMakeLists 这是我的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
                       )

This is my native-lib.cpp 这是我的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;
};

So what could be the reason that Android studio cannot find the method from my .so library, and appear java.lang.UnsatisfiedLinkError? 那么,Android Studio无法从我的.so库中找到方法并出现java.lang.UnsatisfiedLinkError的原因可能是什么? Also, I don't why my x86 library is 64bit instead of 32bit. 另外,我不解释为什么我的x86库是64位而不是32位。

Thanks 谢谢

UPDATE 更新

Just double check the android log, I think it does not load the tracker library properly. 只需仔细检查android日志,我认为它无法正确加载跟踪器库。 I think now the 64 bits error is the major problem. 我认为现在64位错误是主要问题。 Update the issue title 更新问题标题

java.lang.UnsatisfiedLinkError: dlopen failed: "/data/app/com.example.user.project/lib/x86/libtracker.so" is 64-bit instead of 32-bit java.lang.UnsatisfiedLinkError:dlopen失败:“ / data / app / com.example.user.project / lib / x86 / libtracker.so”是64位而不是32位

In build.gradle I have set the abiFilter, and my AVD is x86 device 在build.gradle中,我已经设置了abiFilter,而我的AVD是x86设备

apply plugin: 'com.android.application' 应用插件:“ 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')
}

Here is what caused your problem: 这是导致您的问题的原因:

sourceSets.main {
    jniLibs.srcDir 'src/main/jniLibs'
    jni.srcDirs = []
}

These definitions do not coexist safely with externalNativeBuild . 这些定义不能与externalNativeBuild安全地共存。

Essentially, in the new Android Studio jni.srcDirs is not relevant. 本质上,在新的Android Studio中, jni.srcDirs是不相关的。 It finds which C/++ files to use by analyzing your cmake or ndk-build logs. 它通过分析cmake或ndk-build日志来查找要使用的C / ++文件。 But even when you use externalNativeBuild , AS copies the binaries it finds in jniLibs to the final APK. 但是,即使使用externalNativeBuild ,AS 也会将在jniLibs中找到的二进制文件复制到最终的APK中。 Somehow a wrong version of the libtracker.so got stuck in the src/main/jniLibs/x86 directory. 某个错误版本的libtracker.so卡在src / main / jniLibs / x86目录中。 It is important to remember that build or rebuild won't normally remove/update binaries there. 重要的是要记住,构建或重建通常不会在那里删除/更新二进制文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 java.lang.UnsatisfiedLinkError:dlopen失败:.so库是64位而不是32位 - java.lang.UnsatisfiedLinkError: dlopen failed: .so library is 64-bit instead of 32-bit java.lang.UnsatisfiedLinkError:无法在Windows x86机器上的32位JVM上加载64位SWT库 - java.lang.UnsatisfiedLinkError: Cannot load 64-bit SWT libraries on 32-bit JVM in Windows x86 machine java.lang.unsatisfiedlinkerror无法加载amd 64位.dll ia 32位 - java.lang.unsatisfiedlinkerror can't load amd 64-bit .dll ia 32-bit java.lang.UnsatisfiedLinkError:无法在Windows中的64位JVM上加载32位SWT库 - java.lang.UnsatisfiedLinkError: Cannot load 32-bit SWT libraries on 64-bit JVM in windows Apex数据加载器 - 错误java.lang.UnsatisfiedLinkError:无法在64位JVM上加载32位SW T库 - Apex Data loader - Error java.lang.UnsatisfiedLinkError: Cannot load 32-bit SW T libraries on 64-bit JVM 如何使用64位/ 32位系统修复java.lang.UnsatisfiedLinkError问题? - How to fix java.lang.UnsatisfiedLinkError-Problem with 64-bit / 32-bit Systems? tomcat 5 java.lang.UnsatisfiedLinkError: tomcat\\apache-tomcat-5.5.36\\bin\\tcnative-1.dll: Can&#39;t load IA 32-bit .dll on a AMD 64-bit platform - tomcat 5 java.lang.UnsatisfiedLinkError: tomcat\apache-tomcat-5.5.36\bin\tcnative-1.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform java.lang.UnsatisfiedLinkError:C:\\ Program Files \\ Java \\ jdk1.7.0_09 \\ jre \\ bin \\ jmtp.dll:无法在AMD 64位平台上加载IA 32位.dll - java.lang.UnsatisfiedLinkError: C:\Program Files\Java\jdk1.7.0_09\jre\bin\jmtp.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform 哪个Java版本可以安装Windows x86,Windows x64,以便它将同时在32位和64位上运行 - which java version to install Windows x86,Windows x64 so that it will run on both 32 bit and 64 bit 我应该使用 32 位还是 64 位 JDK? - Should I use 32-bit or 64-bit JDK?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM