首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java.lang.UnsatisfiedLinkError: dlopen失败了64位而不是32位,而.so应该构建在x86中。

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

Stack Overflow用户
提问于 2017-09-14 01:24:14
回答 1查看 4.7K关注 0票数 0

我试图在Android中使用JNI,我在默认情况下由Android创建的本机-lib.cpp示例下添加了JNI函数(在添加C++支持之后)

然而,我正面临一个错误

com.example.user.project.Tracker.isTracking_0(boolean):没有为布尔型Java_com_example_user_project_Tracker_isTracking_10找到实现(尝试了Java_com_example_user_project_Tracker_isTracking_10和Java_com_example_user_project_Tracker_isTracking_10__Z) )

我还试图将其添加到MainActivity中

代码语言:javascript
复制
static {
        System.loadLibrary("tracker");
   }

但我会得到另一个例外

"/data/app/com.example.user.project/lib/x86/libtracker.so“是64位而不是32位

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

构建跟踪器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.O5/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/跟踪器。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

代码语言:javascript
复制
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
                       )

这是我的母语-lib.cpp

代码语言:javascript
复制
#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位错误是主要的问题。更新发行标题

"/data/app/com.example.user.project/lib/x86/libtracker.so“是64位而不是32位

在build.gradle中我设置了abiFilter,我的AVD是x86设备

应用插件:'com.android.application‘

代码语言:javascript
复制
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')
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-14 19:33:30

造成您的问题的原因如下:

代码语言:javascript
复制
sourceSets.main {
    jniLibs.srcDir 'src/main/jniLibs'
    jni.srcDirs = []
}

这些定义不能与externalNativeBuild.安全共存。

本质上,在新的Android中,jni.srcDirs是不相关的。它通过分析cmake或ndk构建日志找到要使用的C/+文件。但是,即使您使用externalNativeBuild,作为副本,它在jniLibs中找到的二进制文件也会复制到最终的APK。不知何故,一个错误版本的libtracker.so卡在src/main/jniLibs/x86目录中。重要的是要记住,构建或重建通常不会在那里删除/更新二进制文件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46209078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档