JNI技术-入门教程

前言:

为什么用JNI技术,jni技术是连接Java和C/C++的桥梁,最近在封装新的SDK,后端技术是用C++写的,想要调用C++的接口,Java本身是调不到的,所以想要调用C的接口就需要一个桥梁,这时候我们就用到了JNI技术。

JNI是什么?:

1、首先我们要明白JNI是什么,JNI(Java native Interface  -Java本地接口)也就是Java与C/C++连接的桥梁;

2、native关键字:使用native所修饰的方法为本地方法,该方法只有声明,没有实现,表示该实现是由C/C++来提供的。

public native void output();

3、jni本质上就是Java代码来调用动态链接库的过程(在Windows上,动态链接库就是一个.dll文件,在Linux上动态链接库就是一个.so文件,如果是在Linux上调用动态链接库必须以lib开始)

我们要使用的动态链接库叫什么名字必须要提供出来,通常都是使用一个静态代码块来提供的

static{
    System.LoadLibrary("HelloWorld");//一定不要加后缀名
}

工作流程:


下面代码:

这是我写的一个Java代码,目的生成jni的头文件 .h文件
package com.butel.jni;

public class Test{
	
	static{
		
		System.loadLibrary("HelloWorld");
		
	}
	
	public native void output();
	
	public static void main(String[] ages){
		
		Test test = new Test();
		test.output();
		
	}
	
} 
package com.butel.jni;

可以看到我这里是有包名的,所以在生成头文件.h文件时,需要在想要的包下。下面是我用cmd执行放入相应的文件夹下

可以看到我这里生成了相应的包名,将Test生成了.class文件


生成.h文件

生成.h文件。我们用jdk里的Javah 去生成,我的jdk是1.8的

先说下在操作时遇到的问题 ,一般情况下,用Javah是可以生成的,也有可能出现下面这样的错误,


解决这样的问题当时我也是折腾了好长时间,就是不能生成.h文件,不过还是被我找到了生成.h的命令

输入一下命令就好了

最终会生成这样的一个.h文件

注意这里生成.h文件后,包名 com.butel.jni 将变为 com_butel_jni 将所有的点都转为了下划线

好了,到这里我们的.h文件就生成了。

 
 
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_butel_jni_Test */

#ifndef _Included_com_butel_jni_Test
#define _Included_com_butel_jni_Test
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_butel_jni_Test
 * Method:    output
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_butel_jni_Test_output
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif


猜你喜欢

转载自blog.csdn.net/Mr_TianChen/article/details/80494358