我試圖讓我的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
感謝您的回覆。我確實安裝了MinGW,並將MinGW/bin放在路徑上。我沒有看到安裝包中的任何DLL,只是exe文件。我以爲MinGW只是爲了編譯? – c12 2012-01-04 18:18:08
我在共享庫JNI DLL上運行了依賴關係的步行者,唯一被標記的是MSJAVA.DLL缺失。根據http://www.dependencywalker.com/help/html/faq.htm,我認爲這可以被忽略... – c12 2012-01-04 22:46:40
我添加了MSJAVA.dll,現在MPR.dll被標記爲警告:at由於延遲加載相關模塊中缺少導出功能,因此至少有一個模塊具有未解析的導入。根據我上面添加的鏈接,這似乎也可以,但不是100%確定的。 – c12 2012-01-04 22:52:48