【发布时间】:2015-03-25 04:03:39
【问题描述】:
我目前正在尝试从 .dll 创建一个 .jar,以便在 Android 应用程序上使用它。我对这项技术还很陌生,所以我会尽量说清楚。
我有 3 个不同的部分:
- 第一个 .dll,它是一个 API,使用 C++ 并使用 Visual Studio 2013 开发。
- 第二个 .dll 用于在我的 API 和 Java 代码之间建立链接(使用 JNI,所以这是我的本机库),也是使用 Visual Studio 2013 开发的。
- 还有我的 Java 代码,它加载我的本机库并从 API 实现本机函数。我使用 Eclipse IDE 来处理这些内容,因为我在某处读到了创建 .jar 的最简单方法。
这部分工作得很好。我创建了一个主测试,并从 Java 中的 API 获取所有信息。但是现在,我想创建一个可以在 Android 上使用的 .jar 文件,然后乌鸦来了……
我尝试了很多方法,从简单的 .jar 导出到 One-Jar 方法,但都没有奏效。我的 android 平台上总是出现链接错误(函数在 .jar 上被识别,但它们的实现不是)。
所以这是我的问题,如何在 .jar 中创建一种可以在 Android 上使用的“静态库”?
我希望我已经足够清楚了,不要犹豫,问我更多细节。
感谢您的帮助!
编辑:
我尝试了一个 Android 库项目,但我的问题总是来自我的 loadLibrary() 函数:
public class MyWrapper {
static {
System.loadLibrary("MyWrapper");
}
public static native int getNegative(int p_number);
public static native int getPositive(int p_number);
}
在我的库上一切正常,但是当我在 android 应用程序中使用它时,我总是得到这个错误:
01-27 11:31:29.565: E/AndroidRuntime(7089): FATAL EXCEPTION: main
01-27 11:31:29.565: E/AndroidRuntime(7089): Process: com.example.wrappertest, PID: 7089
01-27 11:31:29.565: E/AndroidRuntime(7089): java.lang.UnsatisfiedLinkError: Couldn't load MyWrapper from loader dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.example.wrappertest-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.example.wrappertest-2, /vendor/lib, /system/lib]]]: findLibrary returned null
我的库不能创建为静态库,以保持 .dll 上的链接?
【问题讨论】:
-
您构建的是静态 (.a) 库还是共享 (.so) 库?您将只能从 java 加载共享库。
-
这实际上是一个动态的 (.dll)。它适用于Java,但可能不适用于android?如果我创建一个 .so ,我如何将它与我的项目链接,因为 eclipse 只将 .dll 作为本机库。
-
啊 :) 那将是你的问题。正如我在回答中提到的,dll 文件是特定于 Windows 的,无法在 Android 上加载。您需要为您支持的每个架构使用 NDK 为 Android 生成一个共享库。我建议您查看 NDK 提供的示例,因为它们将是了解 NDK 工作原理的最简单方法:)
-
我在做 :) 我会告诉你它是否有效,谢谢你的帮助。
标签: android dll jar android-ndk java-native-interface