3

に存在するネイティブ関数を呼び出すときに、私は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ています。何か案は?

+0

プロジェクトの構造変更時に、あなたは 'sha1_native.c'の構造体を変更しました。そうでない場合は、コードを変更して再コンパイルしてください。成功していない場合は、さらに教えてください。 –

+0

そうですね、ライブラリプロジェクトを作成したとき、そのプロジェクトのパッケージを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 –

+0

と述べたように、私はNDK-構築(.soのファイルを再コンパイル)ライブラリプロジェクトで、清潔で、それは助けていないのでした。 –

答えて

3

さてさて、私は自分の質問の他に答えることを憎むが、私が考えるこれに苦しんで多くの時間後、私はついにそれを考え出しました。自分のアプリケーションのマニフェストでは、私は

AndroidManifestを設定する必要がありました。XML

<uses-library android:name="com.mydomain.sdk" android:required="true" /> 

それは私がオンラインで読むドキュメントは、彼らがこれを使用して言及していないと私はそれだけで何かをするために、依存関係とは対照的に、(アプリケーション間の依存関係を解決するために使用される市場を行うには思っていたので、ほとんどの奇妙な図書館)。また、私はそこにプロジェクトがないときに、少なくとも警告を出すことなく、プロジェクトがコンパイルされて実行されたことが奇妙なことが分かりました。

-

これはもはやコンパイルして実行するには、アプリケーションのために必要とされている - 更新 - 2014年1月。比較的新しい(約1.5年以内に)Androidビルドツールを使用している場合、これはまったく必要ありません。私は1年以上もこの問題を抱えていません。

+0

これをAndroid Manifestに追加する際に問題があります。どこに配置する必要がありますか? 'com.mydomain.sdk'はあなたのパッケージですか?あなたのコードに 'util.Hash'を追加しました – JuiCe

+0

うん、com.mydomain.sdkは私のパッケージです。ちなみに、私はsdk r20以降、このコード行を削除しました。なぜなら、どこに置いても有効ではなくなったからです。なぜ以前に働いたのか分かりませんが、それはありました。 –

+1

注:上記はもう必要なく、実際にはいつか私のアプリを壊していたので、uses-libraryタグを削除して、問題は修正されました。 –