gpt4 book ai didi

android - 疯狂混合 Android 外部 JAR 和 JNI

转载 作者:太空狗 更新时间:2023-10-29 14:33:29 24 4
gpt4 key购买 nike

一段简短的历史。请耐心等待:)

我有一个使用 JNI 的 Android 项目,效果非常好。

我决定从这个 jni 项目的源代码中创建一个外部 jar(用于分发)

为了创建这个 jar,我听取了其他人的建议并创建了一个新的 Java 项目,其中包含我需要存储在 jar 中的几个 jni 类。我已将此 java 项目导出到一个 jar(不是可运行的 jar)

我创建了一个新的 Android 项目,我尝试在其中使用有问题的 jar 文件。

在我玩过这个新的 android 项目后,我开始意识到应该伴随 jni 类的 .so 文件不能驻留在 jar 文件本身中(Eclipse 提示它......)所以我创建了新 Android 项目中的 lib 目录,其中包含 .so 文件。

当我运行这个新的 Android 项目时,我无法使用任何具有 native 方法的类,而且我只能使用那些纯 Java 实现的类。

在尝试创建基于 jni 的对象之一的实例时,我不断收到“ExceptionInInitializerError”。

更新:似乎错误来自于尝试加载行中的 jni 库

System.loadLibrary("lib-jni");

这是日志:

> ERROR/SightEngine(2479): About to load the lib-jni.so
ERROR/SightExample(2479): WARNING: Could not init SightEngine java.lang.ExceptionInInitializerError
ERROR/AndroidRuntime(2479): Uncaught handler: thread main exiting due to uncaught exception
ERROR/AndroidRuntime(2479): java.lang.RuntimeException: Unable to start activity ComponentInfo{eyesight.android.example/eyesight.android.example.SightExample}: java.lang.NullPointerException: println needs a message
ERROR/AndroidRuntime(2479): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)
ERROR/AndroidRuntime(2479): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
ERROR/AndroidRuntime(2479): at android.app.ActivityThread.access$2200(ActivityThread.java:119)
ERROR/AndroidRuntime(2479): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
ERROR/AndroidRuntime(2479): at android.os.Handler.dispatchMessage(Handler.java:99)
ERROR/AndroidRuntime(2479): at android.os.Looper.loop(Looper.java:123)
ERROR/AndroidRuntime(2479): at android.app.ActivityThread.main(ActivityThread.java:4363)
ERROR/AndroidRuntime(2479): at java.lang.reflect.Method.invokeNative(Native Method)
ERROR/AndroidRuntime(2479): at java.lang.reflect.Method.invoke(Method.java:521)
ERROR/AndroidRuntime(2479): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
ERROR/AndroidRuntime(2479): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
ERROR/AndroidRuntime(2479): at dalvik.system.NativeStart.main(Native Method)
ERROR/AndroidRuntime(2479): Caused by: java.lang.NullPointerException: println needs a message
ERROR/AndroidRuntime(2479): at android.util.Log.println(Native Method)
ERROR/AndroidRuntime(2479): at android.util.Log.e(Log.java:208)
ERROR/AndroidRuntime(2479): at eyesight.android.example.SightExample.onCreate(SightExample.java:28)
ERROR/AndroidRuntime(2479): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
ERROR/AndroidRuntime(2479): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
ERROR/AndroidRuntime(2479): ... 11 more
ERROR/dalvikvm(2479): Unable to open stack trace file '/data/anr/traces.txt': Permission denied

一些提示:

  • 我可以在 .apk 文件中看到 .so 文件。
  • 我已经尝试在 JNI Android.mk 中定义外部 jar 文件,但没有发生令人兴奋的事情。这是我使用的行(编译没有问题..)

    LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := libtestjar:lib/testJar.jar包括 $(BUILD_MULTI_PREBUILT)

  • 我能够使用仅存在于 jar 文件中的常规 java 类。 (我知道我在重复自己......:))这意味着我已经在项目中正确定义了这个 jar。

    • 包含基于 jni 的类的 java 项目引用了 android.jar(sdk 级别 7)

有人对如何完成这项任务有任何建议吗?我觉得我快到了......

感谢您的时间和努力:)

伊塔马尔

最佳答案

在android项目中,你把你的.so文件放在lib/armeabi下了吗?

顺便说一句,我和你有相同的设置(构建 jar 的 java 项目和使用 jar 的 android 项目)。

我设法将 .so 文件打包到 jar 中......这是我所做的:

-在构建库 JAR 时,我将 .so 文件压缩到一个文件中(例如 armeabi.zip)并将其放入 jar 中的“assets”文件夹中。

-构建 android 项目时,armeabi.zip 将位于您的 apk 中的“assets”文件夹中。

-在运行时(第一次启动)我将 armeabi.zip 的内容从 Assets 中提取到“/data/data/”+ context.getPackageName()。

-最后使用 System.load(/data/data//libfilename.so) 加载提取的 .so 库

希望这对您有所帮助。

法迪

关于android - 疯狂混合 Android 外部 JAR 和 JNI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4145060/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com