2017-05-15 13 views
0

私のプロジェクトでは、JNIエージェントを使用してjava-static-nativeメソッドの結果をインターセプトしたいと考えています。JNIネイティブ静的メソッドインターセプト

私の基本的なアプローチは、バインディング時にすべての静的メソッドをインターセプタメソッドに再バインドすることです。インターセプタメソッドは、可変数の引数を受け取り、呼び出されると、それを静的関数に転送します。

これは適切なアプローチですか?今、私の実装では、私が実際の関数に迎撃機能から可変長引数を転送するのに苦労...

c++ forward function call

誰もがこのためのより良いアプローチのアイデアを持っていますか?あるいは、私は過度に複雑なやり方で何かをしていますか?

+0

Aspectj https://eclipse.org/aspectj/ –

答えて

0

va_argは、パラメータのタイプ情報を提供しません。最高でパラメータの数を取得し、すべての関数が異なるパラメータ数(JNIEnv*jclassを除く)を持っていれば、それを動作させることができます。

特定のメソッドをインターセプトする場合は、インターセプトメソッドのテーブルを作成できます。 JavaHを使用してスタブを生成し、必要に応じて名前を変更してJNINativeMethodテーブルを作成します。

static JNINativeMethod JVM_Methods[] = 
{ 
    // grab function names and signatures from JavaH stubs 
    {"OnDeepLink", "(Ljava/lang/String;)V", (void*)& JNI_OnDeepLink}, 
    ... 
}; 
int JVM_Methods_Count = N; 

// register your overrides 
jint nRes = g_env->RegisterNatives(activity, JVM_Methods, JVM_Methods_Count); 

はまた、私はC関数を登録した後、私は活動/クラスにコールバックし、それらがリンクされているブール値を設定しますちょっとしたトリックを持っています。私は動的にリンクしているので、コールを実行する前に設定されているかどうかを確認する必要があります。

+0

私の目的はすべてのメソッドをインターセプトすることです。そのため、すべてのネイティブメソッドをインターセプタメソッドに再バインドします。私のインターセプタは、呼び出されると元々呼び出されたメソッドのjmethod idを参照することができます...元のメソッドのメモリアドレスを見つけることはできますが、呼び出すことはできません。なぜなら、それは一般的な方法で行う必要があるからです。私はまだ解決策を見つけられませんでした –

関連する問題