10

libsodiumライブラリを Android プロジェクトに統合しようとしています。Android Studio (0.5.8) と gradle (0.9) および Android ビルド ツール (19.1) を使用しています。ライブラリにあるスクリプトで libsodium をコンパイルしました。異なるアーキテクチャ (arm、arm-v7a、mips、x86) 用の 4 つの preBuild ライブラリ (.so ファイル) を取得します。このファイルを jniLibs フォルダー内に配置します。NDK を使用していることを build.gradle ファイルで宣言し、local.properties ファイルでパスを構成します。

このバージョンの gradle では、makefile を記述する必要はありません ( http://ph0b.com/android-studio-gradle-and-ndk-integration/ ) 。

静的呼び出しを行った後、アクティビティでいくつかのネイティブ関数を宣言します。

static {
    System.loadLibrary("sodium");
}

public final static native String sodium_version_string();

onCreate() {
    ...
    Log.d(getClass().getName(), "Sodium version:" + sodium_version_string());
}

Logcat の出力は次のとおりです。

05-29 23:14:10.538     481-1569/system_process I/ActivityManager﹕ Start proc com.example.myapplication2.app.x86 for activity com.example.myapplication2.app.x86/com.example.myapplication2.app.MainActivity: pid=1584 uid=10056 gids={50056, 1028}
05-29 23:14:10.554    1584-1584/com.example.myapplication2.app.x86 D/dalvikvm﹕ Trying to load lib /data/app-lib/com.example.myapplication2.app.x86-2/libsodium.so 0xa4ed8520
05-29 23:14:10.562    1584-1584/com.example.myapplication2.app.x86 D/dalvikvm﹕ Added shared lib /data/app-lib/com.example.myapplication2.app.x86-2/libsodium.so 0xa4ed8520
05-29 23:14:10.562    1584-1584/com.example.myapplication2.app.x86 D/dalvikvm﹕ No JNI_OnLoad found in /data/app-lib/com.example.myapplication2.app.x86-2/libsodium.so 0xa4ed8520, skipping init
05-29 23:14:10.578    1584-1584/com.example.myapplication2.app.x86 W/dalvikvm﹕ No implementation found for native Lcom/example/myapplication2/app/MainActivity;.sodium_version_string:()Ljava/lang/String;
05-29 23:14:10.578    1584-1584/com.example.myapplication2.app.x86 D/AndroidRuntime﹕ Shutting down VM
05-29 23:14:10.578    1584-1584/com.example.myapplication2.app.x86 W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0xa4c46648)
05-29 23:14:10.578    1584-1584/com.example.myapplication2.app.x86 E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.UnsatisfiedLinkError: Native method not found: com.example.myapplication2.app.MainActivity.sodium_version_string:()Ljava/lang/String;
        at com.example.myapplication2.app.MainActivity.sodium_version_string(Native Method)
        at com.example.myapplication2.app.MainActivity.onCreate(MainActivity.java:28)

別のファイルで何かを宣言するのに欠けていますか? カリウム-JNIは本当に必要ですか?このライブラリをプロジェクトに含めるにはどうすればよいですか?

ありがとう。

4

1 に答える 1

1

現在、Java コードはネイティブ ライブラリの使用方法を知る方法がありません。Kalium-JNI を使用するか、必要な部分のみを実装して、JNI 部分を実行する必要があります。

の場合sodium_version_string()、これでうまくいくはずです:

jstring java_com_example_myapplication2_app_MainActivity_sodium_version_string(JNIEnv* env, jclass cls)
{
    return (env*)->NewStringUTF(env, sodium_version_string());
}

ここでの実装は、JNI 規約によりjava_com_example_myapplication2_app_MainActivity_sodium_version_string自動的に感謝に関連付けられます。static native String sodium_version_string()

そのような関連付けを手動で宣言する代わりに を使用できますJNI_Onload()が、実装内の JNI 環境とオブジェクトを処理する必要があります。

于 2014-06-02T10:00:33.507 に答える