jni教程 java_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执行放入相应的文件夹下

a06e453440d8de0e9865b70f62e1f815.png

b1003709a92371600f3f54c73b4bef00.png

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

162a2bed5f5786a9c25e74b23b147453.png

生成.h文件

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

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

2e57b72c2cf30a77ba2995e21e102d91.png

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

输入一下命令就好了

b071ab13bca7462b46d8c631f4257da2.png

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

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

好了,到这里我们的.h文件就生成了。/* DO NOT EDIT THIS FILE - it is machine generated */

#include 

/* 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

打开App,阅读手记

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值