以下のmakefileを変更して、32ビットのウィンドウで実行されるdll(SampleNew.dll)を作成する必要があります。 64ビットWindows環境たぶん2つのdll(1つは64、もう1つは32)を作成するのが最善の方法です。 SampleApi.dllを使用する必要があります(下のLIBS宣言で)。以下はWindows用の有効な32ビットdllを作成しません。それを動作させるために以下を変更する方法に関するアイデア?Windows XP(32ビット)およびWindows 7(64ビット)で実行するMakefileを使用してDLLを作成
CMODE=
SWIG = swig
CC = $(PREFIX)gcc
LD = $(CC)
OBJ_DIR = obj
AUTOGEN_DIR = ../src/java
PACKAGE_DIR = $(AUTOGEN_DIR)/com/test/sample
PACKAGE = com.test.sample
INCLUDES = -I$(JAVA_INCLUDE) \
-I$(SAMPLE_DIR)/include \
-I$(JDK_HOME)/include
LIB_INCLUDES = -L$(SAMPLE_DIR)/lib
LIBS = /lib/libssl.so.4 \
/lib/libcrypto.so.4 \
-lSampleApi \
-lm
DIRS = $(PACKAGE_DIR) $(DIST_DIR) $(OBJ_DIR) $(AUTOGEN_DIR)
CFLAGS = $(CMODE) -Wall -fpic $(INCLUDES) -O0 -g3
SFLAGS = -java $(INCLUDES) -package $(PACKAGE) -outdir $(PACKAGE_DIR)
LDFLAGS = -shared $(LIB_INCLUDES) $(LIBS)
OBJECTS = $(OBJ_DIR)/test_wrap.o
TARGET = $(LIB_DIR)/SampleNew.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)
例外:
java.lang.UnsatisfiedLinkError c:\test\myDllFile.dll: can't load this .dll (machine code=0x101) on a IA 32-bit platform
更新のMakefile:
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)
32ビットDLLは64ビット版Windowsで実行されます... –
@ todda.speot.is:ただし、メインプログラムも32ビットである場合のみです。 –
私は少し混乱しています - それはCかJavaですか?いずれの場合でも、DLLが別の既存のDLL(SampleApi.dll)を使用している場合、SampleApi.dllと同じ(たとえば32ビット)にコンパイルすることしかできません。そうしないと、同じプロセスに常駐できません。 – Asaf