ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

JAVA系列之JNI,你了解了吗?

2021-12-26 22:59:05  阅读:318  来源: 互联网

标签:调用 Java C++ 系列 JNI 方法 JAVA native


JNI,即Java Native Interface,Java本地接口,用于与其他语言交互,说白了就是翻译,把JAVA语言翻译成其他语言,或者把其他语言翻译成JAVA语言,拿C或C++举个例子:

 Java想调C/C++里面的方法,由于语言不通,它们没办法交互,这时,JNI来了,JNI说,我来当你们的翻译,于是乎,Java调用JNI中的方法,而JNI调用C/C++中的方法。

但是JNI的调用不是随随便便的,它们之间存在一个对应关系。

(1)数据类型

基本数据类型转换
Java类型JNI类型本地类型C/C++类型描述
booleanjbooleanuint8_tunsigned char无符号8位
bytejbytecharchar有符号8位
charjcharuint16_tunsigned short无符号16位
shortjshortint16_tshort

有符号16位

intjintint32_tint有符号32位
longjlongint64_tlong long有符号64位
floatjfloatfloatfloat32位
doublejdoubledoubledouble64位
voidvoidvoidvoidN/A

(2)引用类型

引用类型转换
Java类型JNI类型
所有实例引用jobject
java.lang.Stringjstring
java.lang.Throwablejthrowable
java.lang.Classjclass
Ocject[ ]jobjectArray
基本类型[ ]jxxxArray

OK,简单介绍完JNI的一些知识,下面我们实践一波。

先说一下NDK的开发流程:

  1. 在Java中写native代码
  2. 写JNI方法
  3. 写C/C++方法
  4. 配置动态链接库名称
  5. 加载动态链接库
  6. 调用方法

OK,实践

1.Android Studio新建一个native工程

划到最下面,选择native C++ ,下一步

 填好工程名Name、包名Package name、工程保存路径Save location,语言Language选Java ,最小SDK默认即可,下一步

C++ 标准 默认,finish

 自此,native工程创建完毕。观察工程可以看到,AS默认帮我们创建了一个示例:

MainActivity中声明native方法,加载动态链接库,并调用native方法。

 native-lib.cpp中则声明JNI方法,记住cpp文件中一定要包含#include <jni.h>

 native-lib.cpp则通过CMake编译,库的名称,编译成静态库还是动态库,C++源文件

 通过它的示例,我们可以创建一个:

1.新建一个Java 类,类名自由取,我这边类名为JNI

 

 2.声明native方法

public class JNI {



    public native void funtion1();

}

 声明完之后发现它爆红,那是因为JNI中没有相对应的方法。

3.鼠标光键放在方法名上,点击鼠标左键,创建相对应的JNI方法

 这时在native-lib.cpp中自动定义了一个空的JNI方法

 解释一下JNI方法名的含义:

以Java开头,短下划线连接包名,类名,Java中的方法名,即Java_包名_类名_方法名,JNI类中funtion1的返回值为void,那么JNI方法的返回值也要对应。

接下来是JNI方法里面的参数JNIEnv *指针,它相当于环境变量,提供了JNI中的一系列操作的接口函数。jobject 其实就是Java层的实例,说白了就是谁调用这个方法,它就是谁的实例,当前就是JNI。我们操作jobject其实就是操作java层的实例,我们要操作一个实例,无非是两点:(1)获取(get)或设置(set)成员变量(field)的值;(2)调用成员方法(method)。至于如何获取成员变量和成员方法,我们下次再详细说。

4.实现JNI方法

未完待续。。。

标签:调用,Java,C++,系列,JNI,方法,JAVA,native
来源: https://blog.csdn.net/weixin_44078872/article/details/121778609

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有