前言:
为什么用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文件就生成了。
[cpp] view plain copy
/* 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
共同学习,写下你的评论
评论加载中...
作者其他优质文章