Невозможно вызвать собственный метод SWIG с использованием DLL в Windows XP - PullRequest
0 голосов
/ 04 января 2012

Я пытаюсь заставить мою реализацию SWIG работать на Windows XP (32-битной) машине. Мой test.java может загрузить библиотеку DLL общей библиотеки SWIG (System.loadLibrary ("TestJni")), но он выдает следующее исключение, когда я пытаюсь вызвать любую функцию C, которую я раскрыл, используя SWIG. Я в поисках некоторых советов по отладке. Я создал разделяемую библиотеку dll, используя 32-битный Linux, используя Makefile. Может быть, что-то не так в созданной общей библиотеке SWIG SWLL. Я могу заставить это работать на Linux (с несколькими специфическими изменениями для Linux в Makefile). Есть идеи?

Исключение:

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 $@

$(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

Ответы [ 2 ]

0 голосов
/ 05 января 2012

Я опустил java-каталоги, в которых есть заголовочные файлы jdk jni.h и jni_md.h из CFLAGS (compile), включенные в Makefile. Как только я добавил их в Makefile, я смог общаться из java в c с помощью вызовов методов JNI.

0 голосов
/ 04 января 2012
  1. Вполне вероятно, что у вас есть зависимость от Mingw32 dll, которой у вас нет в PATH. Консультируйтесь с обходчиком зависимостей и убедитесь, что у вас есть эти DLL в вашей PATH.

  2. Вам необходимо изменить флаг компилятора. Я думаю, что вы пропустите следующие варианты:

    -D_JNI_IMPLEMENTATION_ -Wl,--kill-at

...