Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
932 views
in Technique[技术] by (71.8m points)

jar - Setting up JNA in Android Studio

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.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...