簡體   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

我正在嘗試在Android Studio中使用JNI,我在默認情況下(添加C ++支持后)由Android Studio創建的示例native-lib.cpp下添加了JNI函數。

但是,我遇到了一個錯誤

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)

我也嘗試將其添加到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')
}

這是導致您的問題的原因:

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目錄中。 重要的是要記住,構建或重建通常不會在那里刪除/更新二進制文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM