2017-05-03 4 views
2

私は無意味なタイトルをお詫びしますが、これを一文で要約する方法は不明です。私が持っているのは、javaのデフォルトパッケージからすべてを呼び出す古いDLLファイルです。これらのクラスをリフレクションなしでデフォルトのパッケージからインポートすることはできません。また、それらをリファクタリングする必要があります。問題は、DLLのソースコードがなく、取得できないことです。私は、すべてのメソッド呼び出しをリダイレクトする中間的なdllを作成しました。たとえばJavaでは、refactoredMethodを呼び出して中間DLL内のrefactoredMethodを呼び出し、中間DLLは元のDLL内のoriginalMethodを呼び出します。オリジナルのDLLは、このような何かをしようとするまでは、アップ正常に動作します:JNI - クラスのインスタンス化を別のクラスに置き換えることは可能ですか?

jclass cls = (*env)->FindClass(env, "UnpackagedClass"); 

しかし、明らかに、私はこのクラスをリファクタリングし、パッケージにそれを移動したことから、これは失敗します。それは、中間DLL内部から

jclass cls = (*env)->FindClass(env, "com/test/RefactoredClass"); 

でオリジナルDLL内にある

jclass cls = (*env)->FindClass(env, "UnpackagedClass"); 

のすべてのインスタンスを置き換えるためにすべての可能性にあるのであれば、私は思ったんだけど。ちなみに、誰かが何かを言う前に、それはサイズのために元のDLLを書き換えることはできません、それ以外のメンテナンスは必要なく、私はそれを使用する許可を持っています。ありがとうございました。

+0

は、パッケージ内のクラスにアクセスしている夕食の簡単なアダプタを見てみましょうか?それがjarファイルであると仮定すると、jarファイルを 'UnpackagedClass extends com/test/RefactoredClass {...}'クラスに置き換えることができますか? –

+0

おそらく、あなたはクラスローダーで汚いものを試すことができます... – user2543253

答えて

0

元のDLLを変更する機会がない場合は、アダプタパターンの使用を検討してください。

このパターンは、あるインターフェイスを別のインターフェイスに適用する場合に使用します。

これはおそらくあなたのJava実装ではたくさんのクラスを作成するでしょうが、他に選択肢がなければ、私はそのようにします。 DLLから `UnpackagedClass`を取得している

https://github.com/mkowsiak/jnicookbook/tree/master/recipeNo028

関連する問題