会计考友 发表于 2012-8-4 12:28:23

Java中怎样调用dll动态库

解压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);
  }

  }

会计考友 发表于 2012-8-4 12:28:24

Java中怎样调用dll动态库

</p>  关于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 文件

会计考友 发表于 2012-8-4 12:28:25

Java中怎样调用dll动态库

</p>  ################################################################################
  # 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: $
页: [1]
查看完整版本: Java中怎样调用dll动态库