当前位置: 首页 > 知识库问答 >
问题:

UnsatisfiedLinkError:dlopen在64位而不是32位while中失败。所以应该在x86中构建

公良云
2023-03-14
static {
        System.loadLibrary("tracker");
   }

但我会得到另一个例外

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

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

这是我的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
                       )

这是我的母语-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无法从my.So库中找到方法并出现java.lang.UnsatisfiedLinkError的原因是什么呢?另外,我不知道为什么我的x86库是64位而不是32位。

应用插件:'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')
}

共有1个答案

马寒
2023-03-14

以下是导致您出现问题的原因:

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

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

本质上,在新的Android Studio中jni.srcdirs并不相关。它通过分析cmake或ndk-build日志来查找要使用的C/++文件。但是即使使用externalNativeBuild,AS也会将它在jniLibs中找到的二进制文件复制到最终的APK中。不知何故,在src/main/jnilibs/x86目录中出现了一个错误版本的libtracker.so。重要的是要记住,构建或重建通常不会在那里删除/更新二进制文件。

 类似资料:
  • 问题内容: 在Java中,是否保证int始终为32位,而长为64位,而不管体系结构是32位还是64位? 问题答案: Java是平台无关的。所以是32位,并且是64位的。

  • 所以我不确定应该如何处理它们:有符号的优点是在0附近是安全的,因为那里没有间断,而无符号的优点是在2^63附近,因为那里没有间断。然而,在实践中,您看不到任何接近2^63的地址,因为当前商品硬件的虚拟地址空间被限制在50位以下。这是指签名吗? 1...,有时堆和其他映射区域不靠近地址空间的底部或顶部。

  • 问题内容: 我想知道x86和x64中的64位长吗? 问题答案: 是。Java 在任何JVM上都是64位,无一例外。所有Java原语类型都是完全可移植的,并且在所有实现中都具有固定的大小。

  • 问题内容: 我的电脑正在使用Windows 7 64位。但是将要部署我的jsp Web应用程序的服务器是32位。 我需要在PC上安装32位JDK / JRE才能进行开发吗?我正在使用Eclipse。 非常感谢你。 问题答案: 您绝对不需要安装32位JRE即可进行开发。您构建的Java代码不会跟踪您的64位。(我假设您没有使用JNI,这会使事情变得有些复杂。) 不过,您 可能 需要安装32位JRE进

  • 问题内容: 在64位计算机上,Java中的int大小是32位还是64位? 问题答案: 32位。这是Java语言的功能之一,整数的大小不会随基础计算机而变化。请参阅规范的相关部分。

  • 据我所知,预构建的wheel应该同时支持64位和32位arch。 如何获得支持32位的?