`
zhaohaolin
  • 浏览: 1020568 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

    博客分类:
  • JAVA
 
阅读更多
Java中调用DLL方法,是通过JNI接口实现的,http://www.ibm.com/developerworks/cn/java/l-linux-jni/ 这里有详细的说明。大概是先用Java写一个接口类,然后用javah 生成一个xxx.h的c语言的头文件,然后用C实现这个头文件,在这个实现接口中调用其他已经实现的接口。

解压JNative-1.3.2.zip 获得三个文件,分别是:JNativeCpp.dll,libJNativeCpp.so,JNative.jar 。JNativeCpp.dll Windows下用的,拷到windows / system32目录下;
libJNativeCpp.so Linux下使用的;
JNative.jar 这是一个扩展包,加载到你的程序中就可以。

一个简单例子
import org.xvolks.jnative.JNative;
import org.xvolks.jnative.Type;
import org.xvolks.jnative.exceptions.NativeException;
public class JNativeTest {
   
    public static final int messageBox(int parentHandle, String message,
             String caption, int buttons){// throws NativeException, IllegalAccessException {
          JNative n = null;
          try {
             n = new JNative("User32.dll", "MessageBoxA"); //“.dll”不用也可以, 常量DLL_NAME的值为User32.dll
             // 构造JNative时完成装载User32.dll,并且定位MessageBoxA方法
             n.setRetVal(Type.INT); // 指定返回参数的类型
             int i = 0;
             n.setParameter(i++, Type.INT, "" + parentHandle);
             n.setParameter(i++, Type.STRING, message);
             n.setParameter(i++, Type.STRING, caption);
             n.setParameter(i++, Type.INT, "" + buttons); // 指定位置上的参数类型和值
             n.invoke(); // 调用方法
             return Integer.parseInt(n.getRetVal());
          }
          catch(Exception ex){
           ex.printStackTrace();
          }
          finally {
          
             if (n != null)
     try {
      n.dispose();
     } catch (NativeException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     } catch (IllegalAccessException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     } // 记得释放
          }
          return 0;
       }
    public static void main(String[] args) throws NativeException, IllegalAccessException{
        JNativeTest.messageBox(100,"这是使用jnative练习", "jnativetest", 1);
    }
}
关于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 '' ''
文章出处:http://www.diybl.com/course/3_program/java/javajs/2008520/117063.html
分享到:
评论

相关推荐

    在Java程序中使用JNative调用dll文件

    在Java程序中调用DLL(动态链接库)文件通常是通过JNI(Java Native Interface)来实现的,而JNative是JNI的一个封装库,它提供了一种更简洁的方式来调用C/C++编写的本地代码。这篇博客文章可能介绍了如何利用...

    Java调用DLL源代码

    Java调用DLL是Java开发中一个重要的技术主题,它允许Java程序与本地操作系统API或者其他C/C++编写的动态链接库进行交互。在Java中,有多种方法可以实现这个功能,其中最常用的是Java Native Interface (JNA) 和 ...

    Java调用动态库.pdf

    Java 调用动态库 Java 调用动态库是 Java 语言中的一种技术,用于调用动态链接库(DLL)...Java 调用动态库是一种复杂的技术,需要了解 JNI 和 JNative.jar 的使用方法,以及 JNI 中 Java 类型与 C/C++ 类型对应关系。

    java调用动态库实例

    总结,Java调用动态库实例展示了如何利用JNA和JNative在Java中调用本地函数,既适用于独立的Java应用,也适用于Web项目。JNA提供了更简洁的接口,而JNative则提供了对本地代码的直接访问。理解并掌握这两种技术,将...

    JNA.jar-JNative.jar-jinvoke.jar-dll创建-JAVA调用-VC调用

    这个压缩包文件提供了关于如何在Java中调用C/C++编写的动态链接库(DLL)的示例,以及反向操作,即在C/C++中调用DLL。让我们详细探讨这些关键知识点。 首先,`JNA.jar`(Java Native Access)是Java平台上的一个...

    Java调用动态库最简便方法.pdf

    ### Java调用动态库最简便方法 #### 引言 在跨语言开发中,Java调用其他语言(如C/C++)编写的动态链接库(DLL)是一种常见的需求。传统上,这种调用通常依赖于Java Native Interface (JNI),但这种方法涉及到较为...

    Java类中调用dll的步骤及jar包

    首先,Java调用dll主要依赖于Java本地接口(Java Native Interface, JNI)。JNI允许Java代码与本地代码(如C++或C)进行交互。为了在Java中使用dll,你需要遵循以下步骤: 1. **创建Java接口**:定义一个Java接口,这...

    JNative.jar以及JNative源码

    然而,JNative以其简洁的API和良好的性能,成为许多开发者在Java调用DLL时的首选工具。 总的来说,JNative为Java开发者提供了一座通向本地代码的桥梁,使得Java应用可以充分利用本地资源,实现更高效、更丰富的功能...

    JAVA如何调用dll:用JNI调用C或C++动态联接库原来如此简单[归类].pdf

    通过上述步骤,我们成功地使用JNative在Java中调用了C/C++的动态链接库。这种方式不仅简化了开发过程,还提高了程序的性能。对于需要调用C/C++库的Java开发者来说,JNative提供了一个简洁而有效的解决方案。

    java调用本地化(dll)实用文档

    - **优势**:相较于传统的JNI,使用JNA可以避免复杂的适配器编写工作,仅需在Java中定义接口和代码即可直接调用DLL或SO中的函数。 - **应用场景**:适用于需要与操作系统底层交互的应用场景,如硬件控制、系统服务...

    JNative_1.4RC2_src.zip

    《Java调用C语言库:JNative 1.4RC2源码解析》 在Java编程中,有时我们需要利用已有的C/C++库来扩展功能,实现Java与C语言之间的互操作性。JNative是一个非常实用的开源工具,它允许Java程序直接调用C语言编写的...

    Jnative资源包源码

    Jnative是一款强大的Java本地接口库,它允许Java程序直接调用C和C++的动态链接库(DLL或.so文件),极大地拓展了Java平台的功能。本文将深入探讨Jnative的核心概念、工作原理以及如何在实际开发中应用。 一、...

    JNative资源包

    JNative 是一个 Java 开发库,它允许 Java 程序员直接调用本地(C/C++编写的)动态链接库(DLL)或共享对象(SO),无需通过 Java Native Interface (JNI) 的复杂过程。这个资源包包含 JNative 的 jar 包、源代码...

    org.xvolks.jnative 源码

    3. **Java调用本地方法**:在`org.xvolks.jnative`的API中,用户可以通过简单的方法调用来触发本地方法执行。这些方法通常以`native`关键字标记,但实际的实现细节被隐藏,使得调用更加直观。 4. **类型转换**:JNI...

    JNative.jar

    JNative的核心功能在于动态链接库(DLL)的加载和调用。它通过Java Native Interface(JNI)规范来实现这一目标,但比JNI更高级,提供了更简洁的API,减少了开发者直接处理JNI的复杂性。在Java程序中,我们可以通过...

    JNative API

    1. **简洁的API**:JNative 提供了简单的Java接口,用于加载动态库、查找和调用本地函数,使得开发过程更为直观。 2. **自动类型转换**:JNative 自动处理Java和C数据类型的转换,减少了开发者在处理类型匹配上的...

    基于Java的USB-HID设备通信设计与实现.pdf

    首先,论文提到了使用Java调用DLL(动态链接库)的几种常用方法,包括JNI(Java Native Interface)、JNA(Java Native Access)和JNative。JNI是Java调用本地方法的标准方式,但其过程较为繁琐,需要编写带有native...

    Fnthex32.dll

    在IT行业中,斑马(Zebra)公司以其专业、高效的条码打印机而知名,而Fnthex32.dll则是斑马条码打印库中的一个关键动态链接库文件。这个小巧但至关重要的文件在开发和运行涉及斑马条码打印的应用程序时起着至关重要...

Global site tag (gtag.js) - Google Analytics