在Android Studio中设置JNA

Pow*_*Lee 7 android jar jna android-ndk

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

操作系统:Windows 10

IDE:Android Studio 1.5.1

JDK:1.8.0_73

NDK:r10e

我做了什么 (AS = Android Studio)

  1. 使用API​​18通过AS创建一个新项目.

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

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

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

    JNATest \程序\库\ jna.jar

  4. 在AS中,右键单击jna.jar的图标,选择Add as Library
  5. 等待几秒钟,检查文件 - >项目结构 - >应用程序 - >依赖项.我们有jna.jar.(与app\build.gradle相同) 构建gradle
  6. 在MainActivity.java中实现关于JNA的JAVA代码
  7. 在真实设备上运行应用程序索尼Z3(手臂)
  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
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  1. 我为jna.jar错了地方吗?

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

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

Lon*_*zak 8

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

更新:因为有些人问到哪里可以找到*.so文件:

官方JNA站点上,您将找到所有支持的架构(30+)供下载:

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

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

  • 我在哪里可以找到.so文件? (2认同)

小智 8

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

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


Lac*_*zar 2

我在 github 库的一个文件中找到了这个评论 - “如果您使用 Google 的 Eclipse 插件,那么您必须手动从 jna.jar/lib/armeabi 中删除 libjnidispatch.so 并将其添加到项目的 libs/armeabi 目录中。

由于该文件创建于 2012 年,并且 Android Studio 仍处于非常早期的阶段,当时还不是非常流行,因此我认为它可能是 Eclipse 和 Android Studio 的有效注释。我建议你尝试一下。