Jni 学习之路--Jni 小知识库

一、Java 和 native 层对照知识点

1.返回值和参数类型对照表

Java类型本地类型描述
booleanjbooleanC/C++8位整型
bytejbyteC/C++带符号的8位整型
charjcharC/C++无符号的16位整型
shortjshortC/C++带符号的16位整型
intjintC/C++带符号的32位整型
longjlongC/C++带符号的64位整型e
floatjfloatC/C++32位浮点型
doublejdoubleC/C++64位浮点型
Objectjobject任何Java对象,或者没有对应java类型的对象
ClassjclassClass对象
Stringjstring字符串对象
Object[]jobjectArray任何对象的数组
boolean[]jbooleanArray布尔型数组
byte[]jbyteArray比特型数组
char[]jcharArray字符型数组
short[]jshortArray短整型数组
int[]jintArray整型数组
long[]jlongArray长整型数组
float[]jfloatArray浮点型数组
double[]jdoubleArray双浮点型数组

2.native 层调用 java 类方法对照表

函数Java数组类型本地类型
GetBooleanArrayElementsjbooleanArrayjboolean
GetByteArrayElementsjbyteArrayjbyte
GetCharArrayElementsjcharArrayjchar
GetShortArrayElementsjshortArrayjshort
GetIntArrayElementsjintArrayjint
GetLongArrayElementsjlongArrayjlong
GetFloatArrayElementsjfloatArrayjfloat
GetDoubleArrayElementsjdoubleArrayjdouble
函数描述
GetFieldID得到一个实例的域的ID
GetStaticFieldID得到一个静态的域的ID
GetMethodID得到一个实例的方法的ID
GetStaticMethodID得到一个静态方法的ID
Java 类型符号
booleanZ
byteB
charC
shortS
intI
longL
floatF
doubleD
voidV
objects对象Lfully-qualified-class-name;L类名
Arrays数组[array-type [数组类型
methods方法(argument-types)return-type(参数类型)返回类型

二、Jni 实战

对于 Java 层调用 Native 层方法,在上一篇文章有介绍 Jni 学习之路–入门尝鲜详细教程

下面我们实战 Native 层调用 Java 层的例子

在 Simple.java 中,我们在 main 方法中创建一个 Point.java 对象,但这个对象不是像我们平时创建对象那样 new 处理,而是在 native 层使用 c 语言帮我们创建。具体代码实现如下。

Simple1.java

public class Simple {

	public static void main(String[] args) {
		
		Point point = createPoint();
		
		System.out.println("point: x = " + point.getX() +" , y = " + point.getY());
	}

    // native 方法构建而来
	private native static Point createPoint();

	static{
		System.load("E:/study/vsworkspace/StudyJniProject/x64/Debug/StudyJniProject2.dll");
	}

}

Point.java

public class Point {
	private int x;
	private int y;
	
	public Point(int x,int y){
		this.x = x;
		this.y = y;
	}
	
	public int getX() {
		return x;
	}
	
	public void setX(int x) {
		this.x = x;
	}
	
	public void setY(int y) {
		this.y = y;
	}
	
	public int getY() {
		return y;
	}
}

com_vegen_study_Simple.h

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

#ifndef _Included_com_vegen_study_Simple 
#define _Included_com_vegen_study_Simple 
#ifdef __cplusplus
extern "C" {
#endif

JNIEXPORT jobject JNICALL Java_com_vegen_study_Simple_createPoint
(JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

Simple.c

#include "com_vegen_study_Simple.h"

JNIEXPORT jobject JNICALL Java_com_vegen_study_Simple_createPoint
(JNIEnv *env, jclass jclz){
	// jclz 是 Simple.java

	// 获取 Point 的 class,参数 2:name = "全类名",注意不是 . 而是用 / 间隔
	jclass point_clz = (*env)->FindClass(env,"com/vegen/study/Point");
	// 构建 java 层的 Point 对象,j_mid 构造函数的 id , 构造方法 <init>,<II> 表示参数类型,V 表示返回类型
	jmethodID j_mid = (*env)->GetMethodID(env, point_clz, "<init>", "(II)V");

	jobject point = (*env)->NewObject(env, point_clz, j_mid, 100, 101);

	// 给 Point 的 y 赋值 ,调用它的 setY 方法
	j_mid = (*env)->GetMethodID(env, point_clz,"setY","(I)V");
	
	(*env)->CallVoidMethod(env, point, j_mid, 33);

	return point;
}

以上运行结果是 x = 100,y = 33

此文章讲解的是基础,在后面会讲解 c++ 的使用,以及 opencv、ndk 的相关内容,敬请期待。

参考:

1.https://www.cnblogs.com/daniel-shen/archive/2006/10/16/530587.html

2.https://www.jianshu.com/p/3dab1be3b9a4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值