に存在するネイティブ関数を呼び出すときに、私はSHA1のを計算するために(.soは)共有ネイティブライブラリを作成するには、Android NDKを使用するAndroidアプリを構築し、それが中にいたとき、それがうまく働いていました1つの自己完結型プロジェクト。最近、私はそのプロジェクトをAndroid共有プロジェクトにしてそこにjniコードを保存しましたが、共有プロジェクトを参照する新しいプロジェクトを作成しましたが、プロジェクトは正しく動作するようですが、ネイティブ関数を呼び出すときUnsatisfiedLinkErrorを取得します。 native関数は、Hashという名前のJavaクラス内から呼び出されます。このクラスの内部には、ファイルのsha1ハッシュを計算するための呼び出しを行ういくつかのネイティブ関数があります。しかし、私はエラーを取得していき、のAndroid NDKないUnsatisfiedLinkErrorのAndroidライブラリプロジェクト
NDK/JNIコードがコンパイルされつつあり、それは、アプリケーションのAPKに入るん。私は自分の携帯電話でアプリケーションをアンインストールし、古い参照を取得していないことを確認するためにndk-build cleanを行った。中(
Hash.java
package com.mydomain.sdk.util.Hash
public class Hash {
static {
System.loadLibrary("native_sha1")
}
public static native String getFileHashNative(String fileName);
}
は、その後、私は持っている:私も、JNI関数の名前は、だからここ
は私のコードの要旨である一致していることを確認し作りました同じプロジェクト
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
}
私は(アンドロイドライブラリプロジェクトにこれを入れて)共通のコードを再利用することができるように私は私のプロジェクトの構造を変更するまで、とにかく、このすべてがとてもうまくいきました。私のアプリをコンパイルして.apkファイルを開くと、libディレクトリが表示され、その中にarmeabi/libnative_sha1.soファイルがあります。したがって、そこには間違いなく機能しています。
アップデート - 私はいくつかのデバッグを追加しましたので、いくつかのデバッグ情報
[OK]を..私は、静的ブロックからの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の私と私のアプリケーションプロジェクトは、ちょうどSHA1のソースコードは、私がここで何が起こっているかを得ることはありませんcom.mydomain.sdk.util.Hash 下ライブラリプロジェクトに存在する をcom.mydomainています。何か案は?
プロジェクトの構造変更時に、あなたは 'sha1_native.c'の構造体を変更しました。そうでない場合は、コードを変更して再コンパイルしてください。成功していない場合は、さらに教えてください。 –
そうですね、ライブラリプロジェクトを作成したとき、そのプロジェクトのパッケージをcom.mydomainからcom.mydomain.sdkに変更しました。 com.mydomain.sdkを開始点としてすべてのリファクタリングしました。 プロジェクトのすべての参照を更新し、正しくコンパイルするためにJavaを取得しました。私はそれに応じて私のsha1_native.cファイル関数を更新しました。したがって、もともとHash.javaファイルはcom.mydomain.util.Hashにありました 私はcom.mydomain.sdk.util.Hashに名前を変更しました 私は私のsha1_native.cの にJava_com_mydomain_util_Hash_getFileHashNative からファイルJava_com_mydomain_sdk_util_Hash_getFileHashNative –
と述べたように、私はNDK-構築(.soのファイルを再コンパイル)ライブラリプロジェクトで、清潔で、それは助けていないのでした。 –