Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

    JNATest\app\libs\jna.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 app\build.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.

like image 341
Pow Lee Avatar asked Mar 30 '16 10:03

Pow Lee


1 Answers

For Android, reference the JNA library adding @aar at the end of the string instead of downloading the JNA jar:

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

like image 165
Marcelo Avatar answered Sep 21 '22 00:09

Marcelo