在 Android Studio 中设置 JNA [英] Setting up JNA in Android Studio

查看:99
本文介绍了在 Android Studio 中设置 JNA的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试将 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 复制到项目文件夹中.<块引用>

    JNATestapplibsjna.jar

  4. 在AS中,右击jna.jar的图标,选择添加为库
  5. 等待几秒钟,检查 File->Project Structure->app->Dependencies.我们确实有 jna.jar.(与 appuild.gradle 相同)构建gradle
  6. 在 MainActivity.java 中实现 JNA 的 JAVA 代码
  7. 在真机 Sony Z3(手臂)上运行应用
  8. CLibrary.Instance.printf("Hello, JNA");
  9. 导致崩溃

Android 监视器上的错误消息

E/AndroidRuntime:致命异常:main进程:i3d.jnatest,PID:1068java.lang.UnsatisfiedLinkError:在资源路径 (.) 中找不到本机库 (com/sun/jna/android-arm/libjnidispatch.so)在 com.sun.jna.Native.loadNativeDispatchLibraryFromClasspath(Native.java:866)在 com.sun.jna.Native.loadNativeDispatchLibrary(Native.java:826)在 com.sun.jna.Native.<clinit>(Native.java:140)..... 很快

Java 代码

包 i3d.jnatest;导入 android.support.v7.app.AppCompatActivity;导入 android.os.Bundle;导入 com.sun.jna.Library;导入 com.sun.jna.Native;公共类 MainActivity 扩展 AppCompatActivity {@覆盖protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);CLibrary.Instance.printf("你好,JNA");}公共接口 CLibrary 扩展库{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 的新手,所以可能误解了一些关键点.

解决方案

将 .so 文件放在以下目录(使用 android studio 时):yourprojectappsrcmainjniLibsarmeabi-v7alibjnidispatch.so

更新 I:(直到版本 <= 4.3.0) 因为你们中的一些人问到哪里可以找到 *.so 文件:

官方 JNA 站点上,您会找到所有支持的架构(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 将 AAR 发布到 Maven 中心,其中包含所有 libjnidispatch.so.在这里,使用 gradle 的用户比使用 gradle 的直接 maven 更幸运,后者并不总是选择或正确处理 aars.

I try to import jna.jar into my project since JNA is a very useful tool to call Native library which is base on JNI.

OS: Windows 10

IDE: Android Studio 1.5.1

JDK: 1.8.0_73

NDK: r10e

What I have done (AS = Android Studio)

  1. Create a new project by AS with API18.

  2. Download jna.jar from their GitHub.

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

  3. copy jna.jar into project folder.

    JNATestapplibsjna.jar

  4. In AS, right-click on the icon of jna.jar, choose Add as Library
  5. Wait for few seconds, check the File->Project Structure->app->Dependencies. We do have the jna.jar. (Same as appuild.gradle) build gradle
  6. Implement JAVA code about JNA in MainActivity.java
  7. Run app on real device Sony Z3 (arm)
  8. Crash by CLibrary.Instance.printf("Hello, JNA");

Error Message on Android Monitor

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 code

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);
    }
}

Question

According to error message, I miss /android-arm/libjnidispatch.so in runtime.

  1. Did I put the wrong place for jna.jar?

  2. How should I get and use /android-arm/libjnidispatch.so?

I am a newbie about Android Studio, so maybe misunderstanding something key-point.

解决方案

Put the .so file in the following directory (when using android studio): yourprojectappsrcmainjniLibsarmeabi-v7alibjnidispatch.so

Update I: (up to version <= 4.3.0) Since some of you asked where to find the *.so file:

On the official JNA site you will find all the supported architectures (30+) for download:

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

Download the jar of the architecture you'd like and open it with some zip tool. In there you'll find the libjnidispatch.so file (of course only for unix architectures. For windows its a dll)

Update II: (starting from version >= 4.4.0)

Use the jna-X.X.0.aar file, supplied by the JNA project

As mentioned in a comment - starting from version 4.4.0 JNA publishes an AAR to maven central with all the libjnidispatch.so's in it. Users have had better luck using gradle than straight maven here, which doesn't always select or properly handle aars.

这篇关于在 Android Studio 中设置 JNA的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆