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 __cplusplus
extern "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++接口成功。

    

 

posted on 2014-09-10 17:18  sunseine  阅读(3709)  评论(0编辑  收藏  举报

导航