私は数年前に同様の問題を抱えていました。私はDelphiで書かれたdllを持っていました。(Delphi は、Borland が販売する Pascal ベースの Windows アプリ開発ツールでした。) Java から dll を呼び出す必要がありましたが、一部の dll 関数には、Java と互換性のないパラメーターと戻り値の型がありました。(無関係ではあるが、興味深いことに、Microsoft の C# を発明した Anders Hejlsberg は、Borland の Delphi も発明した。) これが私がこの問題を解決した方法です。
1) jni を使用して、Java コードが dll を呼び出せるようにしました。
2) Java jni コードによって呼び出される実際の dll であるシン ラッパー dll を Delphi で作成しました。Java と完全に互換性のある関数の場合、ラッパー dll は単純にパスとして機能し、実際の dll 関数を直接呼び出して戻り値を返します。互換性のない関数については、ラッパー dll が Java と互換性のある対応するメソッドを定義し、実際の dll を呼び出す前に Java から Delphi への適切な変換を行いました。
3) また、jni 呼び出しの上にシン ラッパー オブジェクトを記述しました。繰り返しになりますが、ほとんどの場合、Java ラッパーは、Java と Delphi の間で完全に互換性のある関数に対して直接 jni 呼び出しを行いました。ただし、私の場合、Delphi オブジェクトを渡すためにいくつかの関数が必要でした。そこで、対応する Java オブジェクトを定義しました。Java ラッパー オブジェクトの主な目的は、これらの Java オブジェクトを取得し、それらを Delphi ラッパー DLL と互換性のあるパラメーターに変換してから、適切な jni 呼び出しを行うことでした。また、オブジェクトを返す dll 関数の場合、私の Java ラッパーは、jni 呼び出しから Java 互換の戻り値を取得し、適切なオブジェクトを作成して組み立てました。
これは大変な作業のように聞こえるかもしれませんが、実際にはそうではありませんでした (私の dll には 100 を超えるメソッドと、12 ほどの Delphi オブジェクト タイプがありました)。作業が終わったら、実際に dll を使用する Java アプリケーション コードを書くのは非常に簡単でした。
ジェネリックに関しては、それが問題になる可能性があります。しかし、実際には、サポートするオブジェクト タイプの数が比較的少ない場合 (実際はそうである場合が多い)、ラッパーでオブジェクト タイプごとに個別の呼び出しを記述できます。(これは、Java 2 がジェネリックを発明する前に行っていたことを覚えている私たちのやり方であり、多少洗練されていなくても問題なく機能していました。) アプリケーションの Java コードでは、ジェネリックを使用することもできます。ラッパーは、渡された実際の型に基づいて適切な呼び出しを行います。
うまくいけば、これがあなたがどのように進むべきかについてのいくつかのアイデアを与えるでしょう.