【问题标题】:UnsatisfiedLinkError: Couldn't load X from loaderUnsatisfiedLinkError: 无法从加载程序加载 X
【发布时间】:2014-08-15 09:20:21
【问题描述】:

我正在尝试使用本机代码制作一个 android 项目来调用 OpenGl 函数。

我正在按照本指南来完成这个项目: http://www.learnopengles.com/calling-opengl-from-android-using-the-ndk/

根据本指南,我必须“在 Package Explorer 中右键单击项目,从下拉菜单中选择 Android Tools,然后选择 Add Native Support...。”。但是,此选项在我的 eclipse 版本中不可见(来自与 sdk 捆绑的 android 站点的最新 osx 版本)。

为了解决这个问题,我使用以下方法手动将项目转换为 C/C++ 项目: 文件 -> 新建 -> 其他 -> 转换为 C/C++ 项目(添加 C/C++ 支持)。

然后,我将 PATH 变量添加到项目属性 -> C/C++ 构建 -> 环境下的环境变量中。我将 ndk 的路径添加到了这个变量中。

此外,我制作了必要的 make-files 并生成了 jni 文件。 该项目确实编译并在 libs 目录中生成一个 .so 文件。 但是,当我尝试在设备上运行项目时,出现以下运行时错误:

异常 java/lang/UnsatisfiedLinkError;初始化 nl/blaat/project_name/JNIWrapper 时抛出; java.lang.UnsatisfiedLinkError: 无法从加载器 dalvik.system.PathClassLoader[dexPath=/data/app/nl.blaat.project_name 加载 GLCore。

当我在网上搜索时,问题的通常答案是本机代码没有编译,但在我的情况下它可以编译。 NDK 提供的示例项目也存在同样的问题。

编辑:一些可能有助于识别问题的额外信息。

  • osx 和 windows 都会出现此问题。
  • 这个问题出现在我的三星 Galaxy s2 和 s5 上,所以它可能不是特定于设备的。
  • SDK 提供的示例也会出现此问题。

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := OpenGLCore
LOCAL_CFLAGS    := -Wall -Wextra
LOCAL_SRC_FILES := OpenGLCore.c jni.c
LOCAL_LDLIBS := -lGLESv2

include $(BUILD_SHARED_LIBRARY)

Application.mk

APP_PLATFORM := android-10
APP_ABI := all

【问题讨论】:

    标签: java android c android-ndk unsatisfiedlinkerror


    【解决方案1】:

    如果来自 NDK 的示例项目出现相同的错误,您确定它是为正确的架构构建的吗?大多数 android 设备运行 ARM 处理器,但有些运行在 x86 和 mips 上,并且许多 NDK 示例默认情况下只为 ARM 构建。

    要为所有架构构建,请将“APP_ABI := all”添加到 jni/Application.mk。

    此外,为了确保您调整后的构建过程确实有效,请尝试通过在终端中手动运行 ndk-build 来构建 .so,首先在项目根目录中运行 NDK 示例。 (之后您可能需要在 eclipse 中刷新文件夹结构,以确保找到并包含新构建的库。)

    【讨论】:

    • 感谢您的建议。我将构建更改为 APP_ABI 到 all 但它没有解决问题。我还使用终端手动构建它,构建过程似乎工作得很好。我也在 windows 上尝试了你的建议(只是为了看看我的 osx 配置有问题),但又出现了同样的错误。
    猜你喜欢
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    • 1970-01-01
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-02
    相关资源
    最近更新 更多