Android NDK を使用して共有ネイティブ ライブラリ (.so) を作成し、sha1 を計算する Android アプリを作成しました。最近、そのプロジェクトを Android 共有プロジェクトに作成し、そこに jni コードを保持しましたが、共有プロジェクトを参照する新しいプロジェクトを作成しましたが、ネイティブ関数を呼び出すときに UnsatisfiedLinkError が発生することを除いて、プロジェクトは正しく動作しているようです。ネイティブ関数は、Hash という名前の Java クラス内から呼び出されます。このクラス内には、ファイルの sha1 ハッシュを計算するための呼び出しを行うネイティブ関数がいくつかあります。
ndk/jni コードがコンパイルされ、アプリケーションの APK に入りますが、引き続きエラーが発生します。携帯電話でアプリをアンインストールし、ndk-build clean を実行して、古い参照が取得されていないことを確認しました..など、運が悪いです。また、jni 関数の名前が
だからここに私のコードの要点があります:
ハッシュ.java
package com.mydomain.sdk.util.Hash
public class Hash {
static {
System.loadLibrary("native_sha1")
}
public static native String getFileHashNative(String fileName);
}
それから私は(同じプロジェクトで
jni/Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_LDLIBS := -llog
LOCAL_MODULE := native_sha1
LOCAL_SRC_FILES := sha1.c sha1_native.c
include $(BUILD_SHARED_LIBRARY)
jni/sha1_native.c
jstring Java_com_mydomain_sdk_util_Hash_getFileHashNative(JNIEnv * env, jclass this, jstring fileName)
{
//call function from sha1.c to get sha1, return to user
}
とにかく、プロジェクトの構造を変更して共通コードを再利用できるようにするまで(これをAndroidライブラリプロジェクトに入れる)、これはすべてうまくいきました。アプリをコンパイルして .apk ファイルを開くと、lib ディレクトリが表示され、その中に armeabi/libnative_sha1.so ファイルがあります。
更新 - いくつかのデバッグ情報
わかりましたので、デバッグを追加しました..静的ブロックからloadLibraryを取り出し、Hash.getFileHashNativeを呼び出す前に呼び出す関数に入れました
12-15 12:34:13.143: D/Hash(31567): Attempting to load native_sha1 lib
12-15 12:34:13.153: D/dalvikvm(31567): Trying to load lib /data/data/com.mydomain/lib/libnative_sha1.so 0x4051e4f8
12-15 12:34:13.163: D/dalvikvm(31567): Added shared lib /data/data/com.mydomain/lib/libnative_sha1.so 0x4051e4f8
12-15 12:34:13.163: D/dalvikvm(31567): No JNI_OnLoad found in /data/data/com.mydomain/lib/libnative_sha1.so 0x4051e4f8, skipping init
12-15 12:34:13.163: W/dalvikvm(31567): No implementation found for native Lcom/mydomain/sdk/util/Hash;.getFileHashNative (Ljava/lang/String;)Ljava/lang/String;
何が原因なのかはわかりませんが、明らかに関数が見つからないようです..変更しているのは mydomain の名前だけで、他のすべては正確です..また、私のライブラリプロジェクトにはパッケージがあることに注意してください. com.mydomain.sdk という名前で、私のアプリケーション プロジェクトは com.mydomain だけです。sha1 のソース コードは、com.mydomain.sdk.util.Hash の下のライブラリ プロジェクトにあります。ここで何が起こっているのかわかりません。何か案は?