5

Javassist を使用して、ネイティブ メソッドにコードを挿入する方法はありますか? この場合、ゲーム内の OpenGL 呼び出しが呼び出されたときに名前と値を出力するようにしようとしていますが、openGL dll コードが追加されていると仮定すると、すべての試行でエラーが発生しました。

メソッドは次のようになります。

public static native void glEnable(int paramInt);

メソッドには最初は本体がないため、実際にコードを追加するために私が見つけた唯一の方法は、次のようなものを使用することです。

CtBehavior method = cl.getDeclaredBehaviors()[0];
method.setBody("System.out.println(\"Called.\");");

インジェクション自体は機能しますが、ライブラリがロードされると、メソッドに既にコードがあると言ってシステムが失敗します。

ユーザーのためにリストをフォーマットして印刷する必要があるため、通話追跡用の既製のツールは使用したくありません。これを処理する方法はありますか?そうでない場合、別のクラス内の OpenGL メソッドへのすべての呼び出しを見つけて、トラッカー クラスに追加の呼び出しを追加する方法はありますか?

4

3 に答える 3

4

少し話題から外れていることは知っていますが(2年後)、誰かが興味を持っている場合は、setNativeMethodPrefix()メソッドと適切なバイトコード変換で実行できると思います.

于 2014-09-24T08:47:39.367 に答える
1
With Javassist, is there any way to inject code into a native method?

試したことはありませんが、うまくいかないのは驚きではありません。ネイティブコードは-ネイティブです。これは、Javaバイトコードとは関係のないプラットフォーム固有のビットの集まりです。そして、JavassistはすべてJavaバイトコードに関するものです。

プロキシベースのAOPの使用を検討しましたか?http://static.springsource.org/spring/docs/current/spring-framework-reference/html/aop.html#aop-understanding-aop-proxiesを確認して ください

プログラムで実際にSpringを使用することはお勧めしませんが、問題への取り組み方についていくつかのアイデアが得られる可能性があります。プロキシベースのAOPが機能すると思う理由は、OpenGLベースのクラスをそのままにして、通常のネイティブメソッドを使用するためです。純粋なJavaであるが、元のクラスと同じメソッドを持つプロキシクラスを生成します。目的の呼び出し追跡コードを含むプロキシクラスのメソッドを呼び出し、さらに「プレーンオブジェクト」の対応するメソッドをそのネイティブメソッドで呼び出します。

Springのドキュメントには、JDK動的プロキシまたは CGLIBが内部で使用されていると記載されています。だから...私はあなたがあなたのjavassistソリューションの代わりとしてこれらの技術の1つを直接使うことができると思っています。

お役に立てれば。

[アップデート]

上記のテキストでは、主にインスタンスメソッドを持つあなたが書いたクラスについて話していると思いました。主に静的メソッドであるOpenGLAPI全体をラップすることについて話している場合、AOPプロキシメソッドはあまり魅力的ではありません。あなたはこれをどれほどひどくしたいですか?あなたは出来る:

  • カスタムクラスを作成します-ファクトリメソッドを持つシングルトンクラス。シングルトンクラスは、OpenGLAPI全体をラップします。ロギング/トラッキングコードはありません。APIへの裸の呼び出し。
  • OpenGLを直接呼び出すのではなく、ラッパーを使用するようにアプリ全体のすべての呼び出しを変更します

この時点で、現在のアプリケーションとまったく同じように機能するアプリケーションができました。

次に、シングルトンクラスのファクトリメソッドを拡張して、OpenGL呼び出し以外は何もしないベアボーンインスタンスを返すか、すべてのメソッドをログに記録するCGLIB生成プロキシを返すことができます。これで、アプリは、構成設定に応じて、本番モード(高速)または追跡モードのいずれかで実行できます。

そして、あなたがこれをあきらめて先に進みたいのなら、私は完全にそれを手に入れます:)

于 2012-09-30T21:15:36.150 に答える