2

ライブラリの 32 ビット バージョンと 64 ビット バージョンを作成しようとしています。

指示:

gcc -D_WIN32 -O2 -shared -I%JAVA_HOME%\include -I%JAVA_HOME%\include\win32 \
-Ic:\OpenSSL-Win32\include -Lc:\OpenSSL-Win32 -leay32 -Lc:\Windows\System32 \
-lnetapi32 -std=c99 -lm -o osaccess-win32.dll osaccess.c

...さまざまなマシンで適切な場合に 32 を 64 に置き換えます。

どちらも正常にビルドされ、私のアプリケーションでは 64 ビットが動作します。ただし、私の 32 ビットのものは、java.lang.UnsatisfiedLinkErrorロードしようとするとエラーが発生します。

java.lang.UnsatisfiedLinkError: com.suture.self.Util.OSAccess.osExec(Ljava/lang/String;)Ljava/lang/String;

このタイプのエラーの通常の手段 (32 ビットjni.hファイルの使用の確認、チェックjava.library.pathなど) をすべて調査しましたが、すべて問題ないようです。

これが何かを意味するかどうかはわかりませんが、dumpbin /exports <dll-name>両方の dll に対して実行したとき、小さな不一致に気付きました。

32ビット

ordinal hint RVA      name
      1    0 00001D1F Java_com_suture_self_Util_OSAccess_osExec@12

64ビット

ordinal hint RVA      name
      1    0 0000200E Java_com_suture_self_Util_OSAccess_osExec

32 ビット DLLの@12の意味は何ですか?

4

1 に答える 1

2

これらのオプションを追加してみてください

-Wl,--export-all-symbols -Wl,--add-stdcall-alias -m32 -shared

32ビット用にコンパイルするときは、リンク行に。--add-stdcall-alias は、装飾されていない/マングルされていない関数名を作成します。

于 2013-11-12T14:24:23.373 に答える