【问题标题】:Android java.lang.UnsatisfiedLinkError - nativeLibraryDirectories (Eclipse)Android java.lang.UnsatisfiedLinkError - nativeLibraryDirectories (Eclipse)
【发布时间】:2014-10-05 21:54:39
【问题描述】:

我正在使用Eclipse 并使用NDK 版本“r9d”。尝试加载库时,我不断收到不满意的链接错误。

我花了几个小时试图在这里找到答案,例如 thisthis,但在尝试了列出的所有解决方案后,我仍然收到相同的错误。

Application.mk

NDK_TOOLCHAIN_VERSION=4.8
APP_CPPFLAGS    := -frtti -fexceptions -std=c++11
APP_STL          = gnustl_static
# armeabi armeabi-v7a mips
APP_ABI         := x86
APP_PLATFORM    := android-16

Android.mk

JNI_PATH := $(call my-dir)
LOCAL_PATH := $(JNI_PATH)

#include $(call all-subdir-makefiles)
include $(JNI_PATH)/C3Core/Android.mk
include $(JNI_PATH)/boost/Android.mk

LOCAL_PATH := $(JNI_PATH)
OPENCV_CAMERA_MODULES:=off
OPENCV_INSTALL_MODULES:=on
OPENCV_LIB_TYPE:=SHARED
include $(JNI_PATH)/OpenCV/sdk/native/jni/OpenCV.mk

LOCAL_MODULE    := Visualizer
LOCAL_SRC_FILES += Visualizer.cpp
LOCAL_C_INCLUDES += $(LOCAL_PATH)
LOCAL_LDLIBS     += -llog -ldl -landroid -ljnigraphics  
LOCAL_CPP_FEATURES += exceptions
LOCAL_STATIC_LIBRARIES += boost_system boost_thread boost_filesystem c3core opencv
include $(BUILD_SHARED_LIBRARY)

Visualizer.java

public class Visualizer {

    public native Bitmap generate(AssetManager mgr, String specifier);

    public native int getSurfaceIndex(int x, int y);

     static {
        try {
            System.loadLibrary("opencv_java");
            System.loadLibrary("Visualizer");
        } catch (UnsatisfiedLinkError e) {
            Log.v("ERROR", "" + e);
        }
    }
}

Android Manifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.iko"
    android:versionCode="1"
    android:versionName="1.0" >

日志

08-12 15:10:22.849: V/ERROR(30905): java.lang.UnsatisfiedLinkError: Couldn't load opencv_java from loader dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.example.iko-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.example.iko-1, /vendor/lib, /system/lib]]]: findLibrary returned null

现在我知道这意味着它找不到库,但我不知道如何解决这个问题。 该库位于我的项目中 libs/x86/,eclipse 项目资源管理器中的完整文件名是 libopencv_java.so - [x86/le]

感谢您的帮助,如果需要更多详细信息,请随时询问。

编辑

这个我也试过了

static {
    try {
        System.load("/data/data/com.example.iko/lib/x86/libopencv_java.so");
        System.load("/data/data/com.example.iko/lib/x86/libVisualizer.so");
    } catch (UnsatisfiedLinkError e) {
        Log.v("ERROR", "" + e);
    }
}

我得到了这个错误 -

08-12 14:55:16.259: V/ERROR(29582): java.lang.UnsatisfiedLinkError: dlopen failed: library "/data/data/com.example.iko/lib/x86/libopencv_java.so" not found

【问题讨论】:

  • 将 ADB 与 run-as 工具或(隐式 root)兼容的 ABI 模拟器一起使用来检查应用程序安装并查看相关库是否实际存在。如果不是,则将 apk 作为 zip 文件打开,看看它是否进入了该文件。

标签: java android eclipse android-ndk


【解决方案1】:

试试这个:

static {
    try {
        System.loadLibrary("opencv_java");
        System.loadLibrary("Visualizer");
    } catch (UnsatisfiedLinkError e) {
        Log.v("ERROR", "" + e);
    }
}

您不应该在传递给 loadLibrary 的库名称中包含 libs/abi 部分。安装APK后,手机上实际只解压了右边的abi子目录,通过loadLibrary函数搜索native libs解压到的目录。 (此外,在搜索匹配文件时,您为 loadLibrary 指定的名称以“lib”为前缀,以“.so”为后缀 - 因此您应该只传递库基本名称,不要传递其他任何内容。)

【讨论】:

  • 请看编辑,我有错字,但我试过了。
  • 您是否尝试过跳过 System.loadLibrary("opencv_java")?由于 Visualizer 的 Android.mk 条目仅提及静态库,而不是动态库(仅 LOCAL_STATIC_LIBRARIES,没有 LOCAL_SHARED_LIBRARIES),我假设 libVisualizer.so 不依赖于 libopencv_java.so,但所有这些都已静态链接。因此 System.loadLibrary("Visualizer") 就足够了。如果没有,请发布“unzip -l yourapp.apk | grep libs”的输出。
  • 另外,请确定一下 - 您确定您的设备是 x86 设备,而不是 arm 设备?
  • 检查是否只有 Visualizer 可以工作,它不会,它仍然没有找到。不过,我认为您对 x86 设备有所了解。我只是有一个灯泡,因为此代码是从另一个使用模拟器的开发人员发送的。我正在使用nexus 7。现在感觉有点傻。让我们看看会发生什么
  • nexus 7 是 arm,而不是 x86,所以从 Applications.mk 中删除 APP_ABI 行(arm 是默认的),或者在那里添加“armeabi”(或 armeabi-v7a),或者更改它进入“all”,构建一个支持所有官方 ABI 的更大的二进制文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多