java中调用 dll 动态库的简洁方法 JNative

来源:互联网 发布:武汉大学数据库 编辑:程序博客网 时间:2024/04/29 14:44

    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)      
     
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 ' '


原创粉丝点击