前言:
为什么用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