0

以下の dalvik/vm/native/dalvik_system_DexFile.cpp にある API を使用したい:

static void Dalvik_dalvik_system_DexFile_defineClass(const u4* args, JValue* pResult)

static void Dalvik_dalvik_system_DexFile_openDexFile_bytearray(const u4* args, JValue* pResult)

しかし、上記の 2 つの API を使用するための適切なインクルード ファイルを libdvm.so に含める方法がわかりません。

Android プロジェクトにヘッダー全体を含めようとしましたが、「引数リストが長すぎます」というコンパイル エラー メッセージで失敗しました。

libdvm.so で上記の 2 つの API を使用するために何をしなければならないか知っている人はいますか? ありがとうございました。

- 追加した -

dalvik/vm/native/dalvik_system_DexFile.cpp には、他のユーザーが静的 API を使用できるようにする追加のコードがいくつかあります。

const DalvikNativeMethod dvm_dalvik_system_DexFile[] =
{ 
{ "openDexFile", "(Ljava/lang/String;Ljava/lang/String;I)I", Dalvik_dalvik_system_DexFile_openDexFile },
{ "openDexFile", "([B)I", Dalvik_dalvik_system_DexFile_openDexFile_bytearray },
{ "closeDexFile", "(I)V", Dalvik_dalvik_system_DexFile_closeDexFile },
{ "defineClass", "Ljava/lang/String;Ljava/lang/ClassLoader;I)Ljava/lang/Class;", Dalvik_dalvik_system_DexFile_defineClass },
{ "getClassNameList",   "(I)[Ljava/lang/String;", Dalvik_dalvik_system_DexFile_getClassNameList },
{ "isDexOptNeeded",     "(Ljava/lang/String;)Z", Dalvik_dalvik_system_DexFile_isDexOptNeeded },
{ NULL, NULL, NULL },
};

上記の 2 つの静的 API を次のように呼び出します。

dvm_dalvik_system_DexFile[1].fnPtr(args, &pResult);

4

1 に答える 1

2

これらは、DexFile クラスの対応するメソッドの JNI 実装です。それらは通常、DexFile.defineClass() メソッドなどを呼び出すことによって Java レベルで呼び出されるか、その Java メソッドを呼び出すための通常の JNI スタッフを使用して JNI レベルで呼び出されます。

ただし、これらのメソッドはどちらもパブリック API の一部ではなく、それらが存在するか、特定のプロトタイプを持っていることに依存することはできません。

独自のカスタム クラスをロードする場合は、DexClassLoaderクラスを参照してください。さらに、DexClassLoader の使用に関する関連ブログ記事を次に示します。

于 2012-10-07T08:30:16.977 に答える