Java中调用DLL方法,是通过JNI接口实现的,http://www.ibm.com/developerworks/cn/java/l-linux-jni/ 这里有详细的说明。大概是先用Java写一个接口类,然后用javah 生成一个xxx.h的c语言的头文件,然后用C实现这个头文件,在这个实现接口中调用其他已经实现的接口。
我看到这个实现方法后,感觉怪怪的,这不是反过来了么?随后在网上看到了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)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
throws
NativeException, IllegalAccessException
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
JNative n = null;
String ret = "";
JNative.setLoggingEnabled(true);
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
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+ " ");
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
} catch(Exception e)...{
System.out.println("cann't call dll: " + dllName +"." +methodName + " ");
e.printStackTrace();
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
}finally ...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if (n != null)...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
try...{
n.dispose(); // 记得释放
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
}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!
################################################################################
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
-include ../makefile.init
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
RM :
=
rm -rf
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
# All of the sources participating in the build are defined here
-include sources.mk
-include subdir.mk
-include objects.mk
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
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
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
-include ../makefile.defs
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
# Add inputs and outputs from these tool invocations to the build variables
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
# All Target
all: libJNativeCpp.so
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
# 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 ' '
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
# Other Targets
clean:
-$(RM) $(OBJS)$(C++_DEPS)$(CC_DEPS)$(C_DEPS)$(CPP_DEPS)$(LIBRARIES)$(CXX_DEPS)$(C_UPPER_DEPS) libJNativeCpp.so
-@echo ' '
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
.PHONY: all clean dependents
.SECONDARY:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
-include ../makefile.targets
subdir.mk 文件
################################################################################
# Automatically-generated file. Do not edit!
################################################################################
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
# Add inputs and outputs from these tool invocations to the build variables
C_SRCS +
=
../jni_util.c
../mem.c
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
CPP_SRCS +
=
../CallBack.cpp
../WindowProcUtil.cpp
../org_xvolks_jnative_JNative.cpp
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
ASM_SRCS +
=
../asm_io.asm
../calls.asm
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
OBJS +
=
./CallBack.o
./WindowProcUtil.o
./jni_util.o
./mem.o
./org_xvolks_jnative_JNative.o
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
OBJS_ASM +
=
./asm_io.o
./calls.o
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
C_DEPS +
=
./jni_util.d
./mem.d
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
CPP_DEPS +
=
./CallBack.d
./WindowProcUtil.d
./org_xvolks_jnative_JNative.d
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
# 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 ' '
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
%.o: ../%.asm
@echo 'Building file: $<'
@echo 'Invoking: GCC Assembler'
nasm -f elf -d ELF_TYPE -o
"
$@
"
"
$<
"
@echo 'Finished building: $<'
@echo ' '
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
%.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 ' '
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)