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生成プロキシを返すことができます。これで、アプリは、構成設定に応じて、本番モード(高速)または追跡モードのいずれかで実行できます。
そして、あなたがこれをあきらめて先に進みたいのなら、私は完全にそれを手に入れます:)