Javaから呼び出される関数を持つjni dllがあります。問題は、この dll がデフォルト パッケージ (dll "Java_classname_methodname" 内) にすべての Java クラスを持っていることです。この dll のソースを取得することは不可能であり、書き換えには非常に長い時間がかかります。したがって、基本的に、デフォルトとは異なるパッケージで Java からこの dll の関数を呼び出す必要があります。16 進エディタと dll 内のチェックサムとアドレスを変更するいくつかのツールを使用して、dll 内の関数の名前を変更しようと何時間も試みましたが、これについての経験がほとんどないため、私には多すぎます。私はこのルートを非常に好みますが、適切なツールやノウハウを持っていません. だから私が残っているのは、Javaでパッケージ名をハードコードしようとすることです。this で説明されているようにjnaを使用してみました次のようなことを行うためのスタック オーバーフロー ポスト:
Map options = new HashMap();
options.
put(
Library.OPTION_FUNCTION_MAPPER,
new StdCallFunctionMapper() {
public String getFunctionName(NativeLibrary library, Method method) {
method.setName(method.getName().replace("com.test.", "");
return super.getFunctionName(library, method);
}
}
);
Native.loadLibrary(..., ..., options);
しかし、メソッドには setName がありません。理想的には、追加のライブラリを使用せずにこれを実行したいと考えていますが、明らかに jna のようなものを使用することに反対しているわけではありません。誰かが尋ねる前に、はい、これはライブラリの使用ライセンスによって許可されています。それが可能であることを知っているので、不可能だとは言わないでください。ただ難しいだけです。どちらの方法で実行する必要があるとしても、私は喜んで作業に取り掛かります (dll を変更するか、外部ライブラリで Java コードを使用するかのいずれか)。ちなみに、最終的には.soおよび.dylibファイルでもこれを行う必要があります(dllほど重要ではありません)。お時間をいただきありがとうございます。