java - UnsatisfiedLinkError: 无法从加载程序加载 X

标签 java android c android-ndk unsatisfiedlinkerror

我正在尝试使用 native 代码创建一个 android 项目来调用 OpenGl 函数。

我正在按照本指南来开展该项目: http://www.learnopengles.com/calling-opengl-from-android-using-the-ndk/

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

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

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

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

Exception java/lang/UnsatisfiedLinkError; thrown while initializing nl/blaat/project_name/JNIWrapper; java.lang.UnsatisfiedLinkError: Couldn't load GLCore from loader dalvik.system.PathClassLoader[dexPath=/data/app/nl.blaat.project_name.

当我在网上搜索时,通常的答案是 native 代码没有编译,但在我的例子中是可以的。 NDK提供的example projects给出了同样的问题。

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

  • 该问题同时出现在 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

最佳答案

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

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

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

关于java - UnsatisfiedLinkError: 无法从加载程序加载 X,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25324057/

相关文章:

android - 使 GridView 项目成为正方形

android - 无法在 Android 中播放 H.264 RTP 流

c - 用于更改 `printf()` 中的字符串输出的变量 - C 语言

在嵌入式编程中 main 启动之前检查 GPIO 的状态

java - 初学者 Android : Files and Checkboxes

java - jQuery 不执行 servlet doGet

java - 将 ARCore 的估​​计环境 HDR 立方体贴图保存到内存

java - Nexus 6P 上硬件传感器的 Android 采样率变化

android - 在 AndEngine 中重复 n 次的时间处理器

c - 在没有 stdlib 的情况下调用 atoi 是未定义的行为吗?