我看到这个实现方法后,感觉怪怪的,这不是反过来了么?随后在网上看到了JNative的说明,原来已经有人封装了这些步骤,使用JNative,你可以直接使用了,而不需要写什么接口C文件了。JNative下载后有3个文件,JNative.jar,JNativeCpp.dll以及libJNativeCpp.so,JNativeCpp.dll是用于window系统的;libJNativeCpp.so是用于linux系统的,不过这个文件是glic2.4下编译的。如果需要底版本,需要重新编译。如何编译,在后面介绍。不管什么系统,都需要把DLL文件放到系统路径下或者是加入到搜索目录。
使用说明:
JAVA中调用比较简单:
public String callDll(String cond)
throws NativeException, IllegalAccessException { 
JNative n = null;
String ret = "";
JNative.setLoggingEnabled(true);
try {
n = new JNative(dllName, methodName); // 常量dllName的值为:windows下不加后缀.dll,linux需要包括后缀.so
n.setRetVal(Type.STRING); // 指定返回参数的类型
int i = 0;
n.setParameter(i++, Type.STRING, cond);
n.setParameter(i++, Type.STRING, cond);
n.invoke(); // 调用方法
ret = n.getRetVal(); //取回返回值
System.out.println("this is call dll:"+ ret+ " ");
} catch(Exception e){
System.out.println("cann''t call dll: " + dllName +"." +methodName + " ");
e.printStackTrace();
}finally {
if (n != null){
try{
n.dispose(); // 记得释放
}catch(Exception e){
e.printStackTrace();
System.out.println("can''t dispose the dll:" + dllName);
}
}
}
return ret;
}
关于linux下编译 C代码部分说明:
对于linux不同版本,可能会导致libJNativeCpp.so不同
原带的libJNativeCpp.so 是在glic2.4下编译的
为了适应glic2.3的情况,重新编译了libJNativeCpp.so,在for gcc3.4.6 glibc 2.3下。
编译办法:
在JNative-1.3.2-src\JNativeCpp\Release目录下
1、备份calls.o和 asm_io.o这两个Object文件
2、make clean
3、恢复到当前目录calls.o和 asm_io.o这两个Object文件
4、make
目前已经修改了Release目录下的makefile和subdir.mk文件,使得在make clean的时候不删除calls.o和 asm_io.o两个文件
附:linux 动态库搜索路径:
export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH
makefile 文件
################################################################################
# Automatically-generated file. Do not edit!
################################################################################
-include ../makefile.init
RM := rm -rf
# All of the sources participating in the build are defined here
-include sources.mk
-include subdir.mk
-include objects.mk
ifneq ($(MAKECMDGOALS),clean)
ifneq ($(strip $(C++_DEPS)),)
-include $(C++_DEPS)
endif
ifneq ($(strip $(CC_DEPS)),)
-include $(CC_DEPS)
endif
ifneq ($(strip $(C_DEPS)),)
-include $(C_DEPS)
endif
ifneq ($(strip $(CPP_DEPS)),)
-include $(CPP_DEPS)
endif
ifneq ($(strip $(CXX_DEPS)),)
-include $(CXX_DEPS)
endif
ifneq ($(strip $(C_UPPER_DEPS)),)
-include $(C_UPPER_DEPS)
endif
endif
-include ../makefile.defs
# Add inputs and outputs from these tool invocations to the build variables 
# All Target
all: libJNativeCpp.so
# Tool invocations
libJNativeCpp.so: $(OBJS) $(OBJS_ASM) $(USER_OBJS)
@echo ''Building target: $@''
@echo ''Invoking: GCC C++ Linker''
g++ -shared -o"libJNativeCpp.so" $(OBJS) $(OBJS_ASM) $(USER_OBJS) $(LIBS)
@echo ''Finished building target: $@''
@echo '' ''
# Other Targets
clean:
-$(RM) $(OBJS)$(C++_DEPS)$(CC_DEPS)$(C_DEPS)$(CPP_DEPS)$(LIBRARIES)$(CXX_DEPS)$(C_UPPER_DEPS) libJNativeCpp.so
-@echo '' ''
.PHONY: all clean dependents
.SECONDARY:
-include ../makefile.targets
subdir.mk 文件
################################################################################
# Automatically-generated file. Do not edit!
################################################################################
# Add inputs and outputs from these tool invocations to the build variables
C_SRCS +=
../jni_util.c
../mem.c 
CPP_SRCS +=
../CallBack.cpp
../WindowProcUtil.cpp
../org_xvolks_jnative_JNative.cpp 
ASM_SRCS +=
../asm_io.asm
../calls.asm 
OBJS +=
./CallBack.o
./WindowProcUtil.o
./jni_util.o
./mem.o
./org_xvolks_jnative_JNative.o 
OBJS_ASM +=
./asm_io.o
./calls.o
C_DEPS +=
./jni_util.d
./mem.d 
CPP_DEPS +=
./CallBack.d
./WindowProcUtil.d
./org_xvolks_jnative_JNative.d 

# Each subdirectory must supply rules for building sources it contributes
%.o: ../%.cpp
@echo ''Building file: $<''
@echo ''Invoking: GCC C++ Compiler''
g++ -I"/home/gongjan/jdk1.5.0_08/include/" -I"/home/gongjan/jdk1.5.0_08/include/linux" -O3 -Wall -c -fmessage-length=0 -Wl,--add-stdcall-alias -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o"$@" "$<"
@echo ''Finished building: $<''
@echo '' ''
%.o: ../%.asm
@echo ''Building file: $<''
@echo ''Invoking: GCC Assembler''
nasm -f elf -d ELF_TYPE -o"$@" "$<"
@echo ''Finished building: $<''
@echo '' ''
%.o: ../%.c
@echo ''Building file: $<''
@echo ''Invoking: GCC C Compiler''
gcc -I"/home/gongjan/jdk1.5.0_08/include/linux" -I"/home/gongjan/jdk1.5.0_08/include/" -O3 -Wall -c -fmessage-length=0 -Wl,--add-stdcall-alias -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o"$@" "$<"
@echo ''Finished building: $<''
@echo '' ''
浙公网安备 33010602011771号