-1

私が今まで行ったことは次のとおりです。

古い lib (libold.so) を jni フォルダーに置き、次のように Android.mk を作成します。

LOCAL_PATH :=$(call my-dir) 

include $(CLEAR_VARS) 
LOCAL_MODULE := libold 
LOCAL_SRC_FILES := libold.so 
include $(PREBUILT_SHARED_LIBRARY) 

その後、ndk-build を実行すると、libold.so を含む新しいフォルダー /libs/armeabi が作成されます。

問題ないようですが、実行すると、呼び出したメソッドが見つかります。解決策は、以前に使用したものと同じ名前のパッケージを変更することです。

私は何を間違っていますか?

4

2 に答える 2

1

ネイティブ .so の JNI_OnLoad ルーチンは、解決するメソッドの特定の Java パッケージ名に対して設定されます。ネイティブ メソッドを解決するクラス (または複数のクラス) で別のパッケージ名を使用する場合、JNI_OnLoad が違いを認識してそのネイティブを正しく登録する方法を認識していない限り、VM は正しいメソッドを見つけることができません。

それをどのように修正するかは、最初にネイティブを登録する方法によって異なりますが、(少し複雑であっても) 登録プロセスでロードが行われているパッケージを特定し、それに応じてメソッドを登録することは可能です。

于 2012-06-24T13:25:59.773 に答える
0

コンパイル済みのライブラリを New Project で直接使用することはできません。パッケージ名が異なると、c ファイル内の対応する関数シグネチャが変わります。

    JNIEXPORT jint JNICALL Java_com_package_class(JNIEnv *d, jobject e, jstring f) { 
//inside function

    }

so ファイルをコンパイルしたプロジェクトのクラスを含む jar が必要であり、新しいプロジェクトからアクセスできるようにするために so ファイル内のネイティブ関数を呼び出します。

于 2012-06-24T13:23:32.343 に答える