JNI之Java调用C++动态库

日期:2014-08-26点击次数:8228

JNI(Java Native Interface),Java本地化编程接口,是Java SDK的一部分,实现了Java和其他语言的交互。通过JNI,Java可以调用其他语言编写的本地动态库。现在就Java通过JNI调用C++动态库,做一个简单的描述。
本实例的试验环境:

项目 描述
操作系统 Windows 7
开发工具 Eclipse 4.4
JDK8
Visual studio 2008
以下演示Java调用C++动态库的过程。
首先在Eclipse中创建一个名为“Sum”的Project,在Project中创建一个Java类“Sum”,并用native声明由本地动态库实现的方法“Add”。

public class Sum {
  public native int Add(int a, int b);
  static 
  {
  System.loadLibrary("SumDll");
  }
  public static void main(String[] args)
  {
  System.out.println(new Sum().Add(1, 1));
  }
}
上述代码中我们用native声明了有两个参数的方法Add,由native声明的方法,不需要Java类实现,它表明该方法由其他本地动态库实现,只需要加载       该本地动态库,本实例中本地动态库的名字为“SumDll”。
编写完Java类之后,cmd到Sum.java文件目录下,用javac命令编译所编写的java类,生成Sum.class。然后运行“javah Sum”命令生成Sum.h头文件。
 
Sum.h的内容如下:
有了Sum.h头文件我们需要通过C++实现其中的函数(方法)。
在VS2010中创建一个名为“SumDll”的动态库项目。因为需要用到“jni.h”,所以在SumDll项目属性中                 将“C:\Program Files\Java\jdk1.8.0_05\include”、“C:\Program Files\Java\jdk1.8.0_05\include\win32”目录添加到“附加包含目录”项中。
在SumDll项目中导入上面生成的“Sum.h”头文件,并创建一个CPP文件“Sum.cpp”实现“Sum.h”文件中的方法。Sum.cpp内容如下:

  #include "stdafx.h"
#include "Sum.h"
  
#ifdef __cplusplus
extern "C" {
#endif
/*
   * Class:     Sum
   * Method:    Add
   * Signature: (II)I
   */
JNIEXPORT jint JNICALL Java_Sum_Add
  (JNIEnv *pEnv
  ,jobject obj
  ,jint nParam1
  ,jint nParam2)
{
  return nParam1 + nParam2;
}
 
#ifdef __cplusplus
}
#endif
编译项目,生成SumDll.dll,将SumDll.dll拷贝至Java工程目录下,运行Java程序,控制台输出结果:
2




软件部        段苏敏
 

姓名:
性别:
电话:
E-mail
问题:
问题描述: