`

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

    博客分类:
  • JAVA
阅读更多
 解压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 '' ''
分享到:
评论

相关推荐

    java调用C++动态链接库dll接口

    本项目涉及的"java调用C++动态链接库dll接口"是解决这种跨语言交互问题的一种方法,主要利用了Java Native Interface(JNA)这一技术。 JNA是Java平台的标准库,它允许Java代码直接调用本机库(如DLL或.so文件)的...

    Java调用DLL源代码

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

    java调用C语言编写的so库中的函数,java调用C语言编写的dll库中的函数

    本文将深入探讨这两种方法,以及如何在Java中调用C语言编写的SO(Linux下的动态链接库)和DLL(Windows下的动态链接库)中的函数。 首先,JNI是Java官方提供的原生接口,允许Java代码直接与本地代码交互。在Java中...

    jna jar实现java调用dll

    标题"jna jar实现java调用dll"指的是使用JNA库来在Java程序中调用Windows平台上的动态链接库(DLL)文件。JNA通过jar包的形式提供服务,使得Java开发者可以方便地将DLL的功能集成到Java应用中。 描述中提到...

    java使用(jna)调用c/c++第三方动态库 dll文件 所用jar包

    Java 使用 JNA(Java Native Access)调用C/C++编写的第三方动态库(DLL文件)是一种常见的技术,它允许Java程序直接与本地操作系统接口交互,而无需编写JNI(Java Native Interface)代码。JNA 提供了一种相对简洁...

    java调用动态库实例

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

    java调用C或者C++动态库dll测试jar包和测试dll

    综上所述,Java调用C或C++动态库主要依赖于JNA库,它为开发者提供了一个简洁的方式来集成非Java代码。通过定义接口和调用其方法,Java程序可以直接使用DLL的功能,极大地扩展了Java的适用范围。在实际开发中,需要...

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

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

    使用JNA替代JNI调用DLL,并解决内存溢出问题

    这就涉及到如何在Java中调用DLL的问题。 #### 方案选择:JNA vs JNI 在Java中调用外部C/C++函数的传统方式是使用JNI(Java Native Interface)。然而,JNI的使用过程相对繁琐,涉及多个步骤,包括编写C/C++接口代码...

    pos机java调用程序demo(基于dll调用)

    在本文中,我们将深入探讨如何使用Java调用DLL库,特别是在银联POS机接口的集成应用上。这个项目是基于JDK1.8开发的,它利用了Maven作为项目管理工具,使得开发者能够更方便地引用和管理DLL库。对于那些在IT行业,...

    Java调用动态库.pdf

    Java 调用动态库是 Java 语言中的一种技术,用于调用动态链接库(DLL),从而实现与native 代码的交互。下面将详细介绍 Java 调用动态库的知识点。 一、使用 JNI 调用动态库 JNI(Java Native Interface)是一种...

    JNA调用C++动态库,传入二维数组,通过C++返回二维数组,java调用C++完整案例

    这里,"EasyLogdll"是你的C++动态库的名称,根据实际情况可能需要加上.dll或.so等后缀。 在C++端,你需要实现`processArray`函数,处理输入的二维数组并返回结果到输出数组。注意,C++的二维数组在内存中是一维连续...

    JNA java调用dll

    在标题"JNA java调用dll"中,我们关注的核心技术就是Java通过JNA来调用动态链接库(DLL)文件,这是在Java中实现跨平台 native 功能的一种方法。 DLL是Windows操作系统中的一个重要概念,它包含了一系列可被不同...

    jna java 调用c动态库

    Java Native Access(JNA)是一种开源的Java框架,它为Java程序员提供了一种简洁的方式来调用C动态库(如.dll、.ocx、.so),大大简化了原本繁琐的JNI(Java Native Interface)调用过程。JNA由SUN公司主导开发,它...

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

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

    java调用DLL、activeX框架 njawin

    Java调用DLL(动态链接库)和ActiveX控件是跨平台编程中常见的技术,尤其在需要与Windows系统原生功能交互时。`njawin`框架为Java开发者提供了一个简便的方法来实现这一目标,使得Java应用程序能够利用DLL和ActiveX...

    Java调用Delphi开发的Dll小结[归类].pdf

    本文主要讨论了两种方法,使得Java应用程序能够调用由Delphi开发的DLL动态链接库。这两种方法分别是:通过JNI(Java Native Interface)和使用JNA(Java Native Access)第三方组件。 1. **JNI调用Delphi开发的DLL*...

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

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

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

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

Global site tag (gtag.js) - Google Analytics