我正在尝试让我的SWIG实现在Windows XP(32位)计算机上运行。我的test.java能够加载SWIG共享库dll(System.loadLibrary(“TestJni”))但是当我尝试调用我使用SWIG公开的任何C函数时,它会抛出以下异常。我正在寻找一些调试技巧。我使用Makefile使用32位Linux创建了共享库dll。在SWIG共享库dll的创建中,也许有些东西是不合时宜的。我能够在Linux上使用它(对Makefile进行一些特定于Linux的更改)。有什么想法吗?
例外:
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共享库的Makefile 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 $@
$(DIRS):
mkdir -p $@
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 :(得分:0)
你很可能依赖于你在PATH中没有它的Mingw32 dll。请咨询dependency walker并确保您的路径中包含这些DLL。
您需要更改编译器标志。我想你错过了以下几个选项:
-D_JNI_IMPLEMENTATION_ -Wl,--kill-at
答案 1 :(得分:0)
我省略了具有jdk的jni.h和jni_md.h头文件的java目录,这些文件来自CFLAGS(编译)包含在Makefile中。一旦我将它们添加到Makefile中,我就可以通过JNI方法调用从java到c进行通信。