3

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 の下のライブラリ プロジェクトにあります。ここで何が起こっているのかわかりません。何か案は?

4

1 に答える 1

3

さて、私は自分自身の別の質問に答えるのが嫌いですが、これに何時間も苦労した後、ついにそれを理解したと思います. アプリケーションのマニフェストで、

AndroidManifest.xml

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

私がオンラインで読んだほとんどのドキュメントでは、これを使用することについて言及されておらず、市場がアプリケーション間の依存関係を解決するために使用するものと関係があると思っていたので、奇妙です (ライブラリの依存関係とは対照的に)。また、プロジェクトがコンパイルされていないのに、少なくとも警告を発することなく、プロジェクトがコンパイルされて実行されたことは奇妙だと思います。

-- 更新 - 2014 年 1 月 --

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

于 2011-12-15T23:45:39.357 に答える