簡體   English   中英

在 Android Studio 中設置 JNA

[英]Setting up JNA in Android Studio

我嘗試將 jna.jar 導入到我的項目中,因為JNA是調用基於 JNI 的本機庫的非常有用的工具。

操作系統:Windows 10

IDE:Android Studio 1.5.1

JDK:1.8.0_73

NDK:r10e

我所做的(AS = Android Studio)

  1. 使用 API18 由 AS 創建一個新項目。

  2. 從他們的 GitHub 下載 jna.jar。

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

  3. 將 jna.jar 復制到項目文件夾中。

    JNATest\\app\\libs\\jna.jar

  4. 在AS中,右擊jna.jar的圖標,選擇Add as Library
  5. 等待幾秒鍾,檢查 File->Project Structure->app->Dependencies。 我們確實有 jna.jar。 (與 app\\build.gradle 相同) build gradle
  6. 在 MainActivity.java 中實現 JNA 的 JAVA 代碼
  7. 在真機 Sony Z3 (arm) 上運行應用程序
  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 的新手,所以可能誤解了一些關鍵點。

將.so文件放在以下目錄(使用android studio時): yourproject\\app\\src\\main\\jniLibs\\armeabi-v7a\\libjnidispatch.so

更新我:(直到版本 <= 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-XX0.aar 文件

正如評論中提到的 - 從4.4.0版開始, JNA 將 AAR 發布到 maven 中心,其中包含所有 libjnidispatch.so。 在這里,用戶使用 gradle 比直接使用 Maven 有更好的運氣,它並不總是選擇或正確處理 aars。

對於 Android,參考 JNA 庫在字符串末尾添加 @aar 而不是下載 JNA jar:

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

我在庫 github 存儲庫中的一個文件中發現了此評論-“ 如果您使用的是 Google 的 Eclipse 插件,那么您必須手動從 jna.jar/lib/armeabi 中刪除 libjnidispatch.so 並將其添加到您項目的 libs/armeabi 目錄中。

由於這個文件是在 2012 年創建的,而且 Android Studio 還處於非常早期的階段並且當時還不是非常流行,我認為它可能是 Eclipse 和 Android Studio 的有效說明。 我建議你試試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM