在Android Studio中设置JNA

时间:2016-03-30 10:18:16

标签: android jar android-ndk 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复制到项目文件夹中。
      

    JNATest \应用\库\ jna.jar

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

    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

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

3 个答案:

答案 0 :(得分: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 :(得分: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的有效说明。我建议你试一试。

答案 2 :(得分:0)

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

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