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


Logo

更多推荐