2012-01-04 11 views
0

SWIG実装をWindows XP(32ビット)マシンで動作させようとしています。私のtest.javaはSWIG共有ライブラリdll(System.loadLibrary( "TestJni"))を読み込むことができますが、SWIGを使って公開したC関数を呼び出そうとすると以下の例外をスローします。私はいくつかのデバッグのヒントを探しています。私はMakefileを使って32ビットLinuxを使って共有ライブラリdllを作成しました。たぶんSWIG共有ライブラリdllの作成に何か不備があります。私はこれをLinux上で動作させることができます(LinuxにはMakefileの変更がいくつかあります)。何か案は?Windows XPでDLLを使用してネイティブSWIGメソッドを呼び出すことができない

例外:

Exception in thread "main" java.lang.UnsatisfiedLinkError: com.test.jni.SampleJNI.setLogLevel(I)V 
     at com.test.jni.SampleJNI.setLogLevel(Native Method) 
     at com.test.jni.Sample.setLogLevel(Unknown Source) 
     at com.test.jni.Example.setLogLevel(Unknown Source) 
     at com.test.jni.Example.main(Unknown Source) 

MakefileのSWIG共有ライブラリDLLを作成:

CMODE= 

SWIG = swig 
PREFIX=/test/mingw/mingw32/bin/i386-mingw32- 
CC = $(PREFIX)gcc 
LD = $(CC) 

OBJ_DIR = obj 
AUTOGEN_DIR = ../src/java 
PACKAGE_DIR = $(AUTOGEN_DIR)/com/test/jni 

PACKAGE = com.test.jni 

INCLUDES = -I$(HEADER_FILES_DIR) # env var that points to a dir with all the .h files 

LIB_INCLUDES = -L$(C_API_DIR)/lib # env var that points to a dir with the C libraries (dlls) 

LIBS = -lMainApi \ # MainApi.dll 
     -lm 

DIRS = $(PACKAGE_DIR) $(DIST_DIR) $(OBJ_DIR) $(AUTOGEN_DIR) # DIST_DIR is passed in 

CFLAGS = $(CMODE) -Wall -fpic $(INCLUDES) -O0 -g3 
SFLAGS = -java $(INCLUDES) -package $(PACKAGE) -outdir $(PACKAGE_DIR) 
LDFLAGS = -shared $(LIB_INCLUDES) $(LIBS) -leay32 -lws2_32 -lrpcrt4 

OBJECTS = $(OBJ_DIR)/test_wrap.o 
TARGET = $(LIB_DIR)/SampleJni.dll 

all: $(DIRS) $(TARGET) 

%_wrap.c: %.i 
    $(SWIG) $(SFLAGS) $< 

$(OBJ_DIR)/%.o: %.c 
    $(CC) $(CFLAGS) -c $< -o [email protected] 

$(TARGET): $(OBJECTS) 
    $(LD) $(OBJECTS) $(LDFLAGS) -o [email protected] 

$(DIRS): 
    mkdir -p [email protected] 

clean: 
    rm -rf $(TARGET) $(PACKAGE_DIR)/* $(TARGET) $(AUTOGEN_DIR) $(OBJ_DIR) 

コンパイルを出力:

[exec] /test/mingw/mingw32/bin/i386-mingw32-gcc obj/ewapi_wrap.o -shared -L/test/backup/jni/lib -lMainApi -lm -leay32 -lws2_32 -lrpcrt4 -o /test/backup/jni/lib/SampleJni.dll 
[exec] i386-mingw32-gcc: --kill-at: linker input file unused because linking not done 
[exec] rm ewapi_wrap.c 

答えて

0
  1. あなたはPingでMingw32 dllに依存している可能性があります。 dependency walkerに連絡し、PATHにこれらのDLLがあることを確認してください。

  2. コンパイラフラグを変更する必要があります。 (コンパイル)のMakefileに含める私はCFLAGSからJDKのjni.h中とjni_md.hヘッダファイルを持っているJavaのディレクトリを省略した

    -D_JNI_IMPLEMENTATION_ -Wl,--kill-at

+0

お返事ありがとうございます。私はMinGWをインストールして、MinGW/binをパスに入れました。私は、インストールパッケージ内にDLLを見ず、exeファイルのみを表示します。私はMinGWが編集のためだけだと思った? – c12

+0

私は共有ライブラリJNI DLLで依存関係ウォーカーを実行しました。唯一表示されるのはMSJAVA.DLLです。 http://www.dependencywalker.com/help/html/faq.htmによると、これは無視できると思います... – c12

+0

私はMSJAVA.dllを追加しましたが、MPR.dllは警告付きでフラグが立てられています:at少なくとも1つのモジュールは、遅延ロード依存モジュールのエクスポート機能が欠落しているため、未解決のインポートを持っています。これは私が上に追加したリンクにもあまりにも良いと思われますが、100%確実ではありません。 – c12

0

:私はあなたが以下のオプションを逃すと思います。それらをMakefileに追加すると、私はJNIメソッド呼び出しによってjavaからcに通信することができました。

関連する問題