【问题标题】:Create a .jar from a .dll从 .dll 创建 .jar
【发布时间】: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


【解决方案1】:

.dll 文件通常是特定于 Windows 的。如果您想在 Android 上加载本机代码,则必须考虑使用本机开发工具包。使用 NDK 的细节有点超出此处的解释范围,但 Android 开发者网站提供了一个不错的起点 http://developer.android.com/tools/sdk/ndk/index.html

至于 jar 本身,您可能需要考虑构建一个 Android 库项目。这本质上是一种将 jar 与一些资产(包括本机库)打包的一种方式,这些资产可供 Android 应用程序项目使用。

【讨论】:

  • 感谢您的回答。实际上,我已经使用 NDK 和 JNI 来检索 Java 中的 .dll 函数。但现在我想用该 Java 代码创建一个 .jar。
  • 啊,在这种情况下,我的编辑可能会有所帮助!您的 jar 是要由 Android 应用程序项目使用,还是打算在 Android 上运行 jar 本身(例如通过 Bash)?我不确定你会如何处理后者,但 Android Library Projects 会帮助处理前者。 :)
  • 不幸的是,我有同样的问题,我不知道如何在我的 Android 库项目中导入和使用我的 .dll 作为本机。
  • 你是如何建设图书馆的?任何在 Android 上运行的本机代码都应该使用 NDK 提供的 ndk-build 脚本构建(严格来说这不是真的,但在大多数情况下这是最好的方法)。这应该在项目的 libs/abi/ 目录中构建一个 libLibraryName.so 文件(不是 .dll)(确保您构建的 abi 与您想要运行的设备相同)。一旦你知道它应该只是使用 System.loadLibrary("LibraryName") (没有'lib'和'.so')从java加载它并使用你的JNI绑定,我假设你已经设置好了。 :)
  • 确实,我使用了 Visual Studio 编译器来创建我的 .dll。我将尝试使用 ndk 脚本。另外,我怕我真的不明白 /abi 是什么?
【解决方案2】:
  1. 使用ndk-build 编译您的库
  2. 创建一个 Android 库模块
  3. 创建 Java 类和 JNI 包装器
  4. 禁用 ndk-build 的 gradle 并在 jni 文件夹中创建 Android.mkApplication.mk
  5. 导入.so库并在Android.mk上预构建
  6. 手动调用 ndk-build 并完成

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    • 2017-09-02
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多