首页 > 代码库 > JNI之JAVA调用C++接口

JNI之JAVA调用C++接口

1、JNI定义(来自百度百科)

  JNI是Java Native Interface的缩写,中文为JAVA本地调用。从Java1.1开始,Java Native Interface(JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。

2、java通过JNI调用c++接口步骤

  1)、创建java包、类

    此处创建 包myJNI,类TestJNI

package myJNI;public class TestJNI {    }

  2)、在TestJNI类中创建native方法

    此处创建sayHello()方法

package myJNI;public class TestJNI {    public native void sayHello();}

  3)、通过javah命令生成C++需要用到的头文件

    下面是我的java工程的目录结构:

    |—eclipse_workspace

       |—TestJNI

       |—src

        |—myJNI

         |—TestJNI.java

    ——用命令行进入java工程所在的目录,进入到与src同级的目录即可

      

    ——用javah命令生成.h文件,因为TestJNI.java在包myJNI中,此时是在src目录下执行命令,所以加上加上包myJNI

      

    ——javah命令执行成功后,在执行命令的目录下(此处为src目录)生成.h文件

      

/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class myJNI_TestJNI */#ifndef _Included_myJNI_TestJNI#define _Included_myJNI_TestJNI#ifdef __cplusplusextern "C" {#endif/* * Class:     myJNI_TestJNI * Method:    sayHello * Signature: ()V */JNIEXPORT void JNICALL Java_myJNI_TestJNI_sayHello  (JNIEnv *, jobject);#ifdef __cplusplus}#endif#endif

 

  4)、创建C++工程

    ——新建工程

    

  ——应用程序类型设置为DLL类型

    

  ——将前面生成的.h文件拷贝到C++工程,放到与.cpp同目录下

    

  ——将JDK安装目录include目录下的jni.h 和 include/win32目录下jawt_md.h和jni_md.h拷贝到VS安装目录下的VC/include目录下

       

  ——将C++工程中生成的dll文件拷贝到到环境变量path所包含的目录下,可以在环境变量中查看path所包含的目录

    我的是将TestJNI.dll拷贝至D:\Program Files\Java\jdk1.7.0_17\bin中

  ——在C++工程中编写sayHello()方法

  方法名必须与TestJNI.h中的方法名一致,否则出错

#include<iostream>#include"myJNI_TestJNI.h" JNIEXPORT void JNICALL Java_myJNI_TestJNI_sayHello(JNIEnv *env, jobject obj) {      using namespace std;      cout<<"hello world!"<<endl; }

  5)、编写java程序,在java中调用C++的sayHello()接口

  ——System.loadLibrary("TestJNI")是加载dll文件,该文件名称必须为C++工程生成的dll文件名称;

  ——testJNI.sayHello()及调用C++实现的接口;

package myJNI;public class TestJNI {    public native void sayHello();    public static void main(String[] args) {        System.loadLibrary("TestJNI");        TestJNI testJNI = new TestJNI();        testJNI.sayHello();    }}

  6)、运行java程序,打印结果为 hello world!  表明通过JNI调用C++接口成功。

    

 

JNI之JAVA调用C++接口