2012-01-04 36 views
0

我試圖讓我的SWIG實現在Windows XP(32位)機器上工作。我的test.java能夠加載SWIG共享庫DLL(System.loadLibrary(「TestJni」)),但當我試圖調用我使用SWIG公開的任何C函數時,它會拋出下面的異常。我正在尋找一些調試技巧。我使用Makefile創建了使用32位Linux的共享庫dll。也許在SWIG共享庫dll的創建中出現了一些問題。我可以讓它在Linux上工作(對Makefile有一些Linux特定的更改)。有任何想法嗎?在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) 

生成文件創建該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 $@ 

$(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. 這很可能是您對Mingw32 dll的依賴,您在PATH中沒有它。請諮詢dependency walker並確保您的PATH中包含這些DLL。

  2. 您需要更改編譯器標誌。我認爲你錯過了以下選項:

    -D_JNI_IMPLEMENTATION_ -Wl,--kill-at

+0

感謝您的回覆。我確實安裝了MinGW,並將MinGW/bin放在路徑上。我沒有看到安裝包中的任何DLL,只是exe文件。我以爲MinGW只是爲了編譯? – c12 2012-01-04 18:18:08

+0

我在共享庫JNI DLL上運行了依賴關係的步行者,唯一被標記的是MSJAVA.DLL缺失。根據http://www.dependencywalker.com/help/html/faq.htm,我認爲這可以被忽略... – c12 2012-01-04 22:46:40

+0

我添加了MSJAVA.dll,現在MPR.dll被標記爲警告:at由於延遲加載相關模塊中缺少導出功能,因此至少有一個模塊具有未解析的導入。根據我上面添加的鏈接,這似乎也可以,但不是100%確定的。 – c12 2012-01-04 22:52:48

0

我遺漏了從CFLAGS(編譯)具有的jdk的jni.h和jni_md.h頭文件的Java目錄包括在Makefile中。一旦我將這些添加到Makefile中,我就可以通過JNI方法調用從java到c的通信。