代码之家  ›  专栏  ›  技术社区  ›  Sierra

从.dll创建.jar

  •  0
  • Sierra  · 技术社区  · 10 年前

    我目前正在尝试从.dll创建一个.jar,以便在Android应用程序上使用它。我对这项技术很熟悉,所以我尽量说得清楚。

    我有三个不同的部分:

    • 第一个.dll是一个API,用C++编写,用Visual studio 2013开发。
    • 第二个.dll是我的API和Java代码之间的链接(使用JNI,所以这是我的原生库),也是用Visual studio 2013开发的。
    • 还有我的Java代码,它加载我的本地库,并从API实现本地函数。我使用eclipseIDE来实现这一点,因为我在某个地方读到了创建.jar的最简单方法。

    这部分工作得很好。我创建了一个主测试,并从Java中的API获取所有信息。但现在,我想创建一个.jar文件,我可以在Android上使用,乌鸦来了。。。

    我尝试了很多方法,从简单的.jar导出到OneJar方法,但都没有奏效。我的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上的链接?

    2 回复  |  直到 10 年前
        1
  •  1
  •   AzCopey    10 年前

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

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

        2
  •  0
  •   Sierra    10 年前
    1. 使用 ndk-build
    2. 创建Android库模块
    3. 创建Java类和JNI包装器
    4. 禁用的渐变 ndk构建 并创建 Android.mk Application.mk 在jni文件夹中
    5. 导入 .so 库并在 Android.mk
    6. 援引 ndk构建 手动完成