(提取码:8676)
一、首先简单交代一下两个问题:
1.什么是JNI - - - JNI的全名为Java Native Interface(Java本地接口)
2.JNI用来干什么 - - - java代码利用JNI可以调用其他语言编写的代码
二、我们以下面的小例子来演示怎么利用JNI来调用c++代码:
c++代码:输出一句“Hello World”
java代码调用C++代码将" Hello World " 输出到控制台。
三、操作步骤如下
1.在java类中声明Native函数
package com.wade;
public class TestJni {
//在java类中声明Native函数
public native void sayHello();
public static void main(String[] args) {
}
}
2.利用javah命令编译生成有关Native方法的头文件
2.1 跳转到工程文件的bin目录下
2.2 利用javah命令编译生成头文件
2.3 操作结果如右图
3.利用VS创建一个C++的动态链接库工程,生成dll文件
3.1创建动态链接库工程
3.2 将编译生成的有关Native方法的头文件放到C++动态连接库工程下
3.3 将头文件导入C++工程的头文件夹
3.3.1 打开头文件存在错误(如下图)发现头文件里还包含其他头文件"jni.h"
- -位于目录Java\jdk1.6.0_10\include
解决办法:将位于目录Java\jdk1.6.0_10\include 的jni.h文件添加到C++工程的头文件夹。(添加过程不再描述)
注意:同时要将上图中出错的#include<jni.h>改为#include"jni.h",因为jni.h在jdk中是系统自带的,而现 在我们将其添加到c++工程则相当于我们自己写了一头文件放到C++工程里,自己定义的用“”。
3.3.2 添加完jni.h文件后发现还是有错,应为jni.h头文件里含包含头文件jni_md.h
- -位于目录Java\jdk1.6.0_10\include\win32
解决办法:将位于目录Java\jdk1.6.0_10\include\win32的jni_md.h文件添加到C++工程的头文件夹。(添加过程不再描述)
3.4创建.cpp文件并在源文件里实现Native方法的代码编写
#include"com_wade_TestJni.h"
#include <iostream>
using namespace std;
JNIEXPORT void JNICALL Java_com_wade_TestJni_sayHello(JNIEnv *env, jobject obj)
{
cout<<"Hello world"<<endl;
}
调试生成dll文件
4.将dll文件的路径添加到系统环境变量path下,这样在任意目录下都可以找到dll文件
5.在java类中加载dll文件
6.调用dll文件的代码
package com.wade;
public class TestJni {
//在java类中声明Native函数
public native void sayHello();
public static void main(String[] args) {
//在java类中加载dll文件
System.loadLibrary("Cjjdll");
//创建对象,并调用方法
new TestJni().sayHello();
}
}
7.运行出现以下问题
解决方法:
Cjjdll动态链接库实在eclipse启动之后导入的,重启eclipse之后会识别到Cjjdll文件。
8.运行结果