在Android Studio中设置JNA

问题描述 投票:7回答:3

我尝试将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相同)build 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

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的新手,所以可能会误解一些关键点。

android jar android-ndk jna
3个回答
7
投票

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

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

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

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

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


1
投票

我在库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的有效说明。我建议你试一试。


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.