【问题标题】:Setting up JNA in Android Studio在 Android Studio 中设置 JNA
【发布时间】:2016-07-18 06:49:29
【问题描述】:

我尝试将 jna.jar 导入到我的项目中,因为 JNA 是一个非常有用的工具,可以调用基于 JNI 的 Native 库。

操作系统:Windows 10

IDE:Android Studio 1.5.1

JDK:1.8.0_73

NDK:r10e

我做了什么 (AS = Android Studio)

  1. AS 使用 API18 创建一个新项目。

  2. 从他们的 GitHub 下载 jna.jar。

    https://github.com/java-native-access/jna

  3. 将 jna.jar 复制到项目文件夹中。

    JNATest\app\libs\jna.jar

  4. 在AS中,右键单击jna.jar的图标,选择添加为库
  5. 等待几秒钟,检查文件->项目结构->应用程序->依赖项。我们确实有 jna.jar。 (与 app\build.gradle 相同) build gradle
  6. 在MainActivity.java中实现JNA的JAVA代码
  7. 在真实设备 Sony Z3 (arm) 上运行应用程序
  8. CLibrary.Instance.printf("Hello, JNA"); 崩溃

Android 监视器上的错误消息

E/AndroidRuntime: FATAL EXCEPTION: main
                   Process: i3d.jnatest, PID: 1068
                   java.lang.UnsatisfiedLinkError: Native library (com/sun/jna/android-arm/libjnidispatch.so) not found in resource path (.)
                     at com.sun.jna.Native.loadNativeDispatchLibraryFromClasspath(Native.java:866)
                     at com.sun.jna.Native.loadNativeDispatchLibrary(Native.java:826)
                     at com.sun.jna.Native.<clinit>(Native.java:140)
..
... so on

Java 代码

package i3d.jnatest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import com.sun.jna.Library;
import com.sun.jna.Native;

    public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        CLibrary.Instance.printf("Hello, JNA");
    }

    public interface  CLibrary extends Library
    {
        CLibrary Instance = (CLibrary) Native.loadLibrary("msvcrt", CLibrary.class);
        void printf(String format, Object... args);
    }
}

问题

根据错误信息,我在运行时错过了/android-arm/libjnidispatch.so

  1. 我是不是把 jna.jar 放错地方了?

  2. 我应该如何获取和使用/android-arm/libjnidispatch.so

我是 Android Studio 的新手,所以可能误解了一些关键点。

【问题讨论】:

  • 您使用了哪个 JNA.jar 文件?我尝试了 4.1.0 和 4.2.2,但仍然为 android 构建错误
  • 我也面临同样的问题..你有什么解决办法吗?

标签: android jar android-ndk jna


【解决方案1】:

将.so文件放到以下目录(使用android studio时):yourproject\app\src\main\jniLibs\armeabi-v7a\libjnidispatch.so

更新 I:(最高版本 因为有些人问到哪里可以找到 *.so 文件:

official JNA site,您将找到所有支持的架构(30+)供下载:

https://github.com/java-native-access/jna/tree/master/lib/native

下载您想要的架构的 jar 并使用一些 zip 工具打开它。在那里你会找到 libjnidispatch.so 文件(当然只适用于 unix 架构。对于 windows 它是一个 dll)

更新二:(从版本 >= 4.4.0 开始)

使用 JNA 项目提供的 jna-X.X.0.aar 文件

正如评论中提到的 - 从版本 4.4.0 JNA publishes an AAR 到包含所有 libjnidispatch.so 的 maven Central。用户在这里使用 gradle 比使用直接 maven 更幸运,后者并不总是选择或正确处理 aars。

【讨论】:

  • 不适合我!同样的错误来了!你能帮忙吗!
  • 不幸的是,不是因为您没有提供有关您的问题的任何信息。请在此处打开另一个问题,其他人也可以帮助您...
  • 在哪里可以找到 .so 文件?
  • JNA 将 AAR 发布到 maven Central,其中包含所有 libjnidispatch.so。应该不需要手动复制。
【解决方案2】:

对于 Android,请参考 JNA 库,在字符串末尾添加 @aar,而不是下载 JNA jar:

https://github.com/java-native-access/jna/blob/master/www/FrequentlyAskedQuestions.md#jna-on-android

【讨论】:

    【解决方案3】:

    我在库 github repo 的一个文件中发现了这条评论 - “If you're using Google's Eclipse plugin then you must manually remove libjnidispatch.so from jna.jar/lib/armeabi and add it into your project's libs/armeabi directory.

    由于这个文件是在 2012 年创建的,而且 Android Studio 还处于非常早期的阶段,那时还不是很流行,我认为它可能是 Eclipse 和 Android Studio 的有效注释。我建议你试试看。

    【讨论】:

    • 感谢您提供此信息。但是我在构建 JNA 源代码时碰壁了。 imgur.com/VQbH1F9我会继续努力的。
    • 我通过删除一些 UTF-8 转义字符的字符成功构建。尝试执行其余步骤..
    • 你不需要重建JNA;只需从 jna.jar 中提取文件并将其放入项目的本机 libs 目录中即可。
    猜你喜欢
    • 2016-05-17
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 2018-04-12
    • 1970-01-01
    • 2021-09-17
    • 2017-03-15
    • 2016-08-23
    相关资源
    最近更新 更多