Android Stduio 下NDK 开发规则

android stduio 下NDK 开发规则介绍

一、类型转换表格

表1-1 基础数据类型的转换关系表

JavaNative类型符号属性字长
booleanjboolean无符号8位
bytejbyte无符号8位
charjchar无符号16位
shortjshort有符号16位
intjint有符号32位
longjlong有符号64位
floatjfloat有符号32位
doublejdouble有符号64位

表1-2 Java引用数据类型的转换关系表

Java引用类型Native类型Java引用类型Native类型
All objectsjobjectchar[]jcharArray
java.lang.Classjclassshort[]jshortArray
java.lang.Stringjstringint[]jintArray
Object[]jobjectArraylong[]jlongArray
boolean[]jbooleanArrayfloat[]jfloatArray
byte[]jbyteArraydouble[]jdoubleArrray
java.lang.Throwablejthrowable

二、常用类型介绍

2.1 JNIEnv结构体介绍
JNIEnv是一个与线程相关的代表JNI环境的结构体,图2-1展示了JNIEnv的内部结构:
这里写图片描述

                      图 2-1 JNIEnv 内部结构图

从上图可知,JNIEnv提供了一些JNI系统函数,通过这些函数能够操作jobject对象和调用java层的函数

2.2 用于操作java类的成员变量和成员函数的两个函数分别是:

jfieldID GetFieldID(jclass clazz,const char *name,const char *sig);

jmethodID GetMethodID(jclass clazz,const char *name,const char *sig);

其中,jclass代表Java类,name表示成员函数或者成员变量的名字,sig为参数类型+返回值信息

2.3 调用Java对象的函数和获取对象字段

NativeType Call<type>Method(JNIEnv *env,jobject obj,jmethodID methodID,...)

其中typeJava函数的返回值类型,NativeType是本地对应的返回值类型

NativeType Get<type>Field(JNIEnv *env,jobject obj,jfieldID fieldID)

void Set<type>Field(JNIEnv *env,jobject obj,jfieldID fieldID,NativeType value)

其中typeNativeType与上述一样,这里的jfieldID就是从上面的GetFieldId中找到的。

表2-1 常用的Get/Set方法

Get方法Set方法
GetObjectFieldSetObjectField
GetBooleanFieldSetBooleanField
GetByteFieldSetByteField
GetCharFieldSetCharField
GetShortFieldSetShortField
GetIntFieldSetIntField
GetLongFieldSetLongField
GetFloatFieldSetFloatField
GetDoubleFieldSetDoubleField

2.4 JNI类型签名介绍

先来看一段动态注册的代码,如果要了解动态注册的相关内容可以到
这里

static JNINativeMethod gMethods[]={
 "stringFromJNI", //java层的函数名
 "()Ljava/lang/String;",  //(参数类型) 返回值类型,即JNI函数签名
 (void *)stringFromJNI //本地库对应的函数名
}

这个数组中的第二个参数正是我们需要了解的
本例对应的java函数为 String stringFromJNI()
对应的JNI签名为

()Ljava/lang/String;
括号内是参数类型的标识,最右边是返回值类型的标识,
返回类型是引用类型时,其格式为 “L包名;”,上述例子的Ljava/lang/String;表示是一个Java String 类型

表2-2 类型标识示意表

类型标识Java类型类型标识Java类型
ZbooleanFfloat
BbyteDdouble
CcharL/java/lang/String;String
Sshort[Iint[]
Iint[L/java/lang/object;Object[]
Jlong

请初一,如果java类型是数组,则标识中会有一个 “[”,引用类型的标识最后都有一个 “;”

表2-3 函数签名的小例子

函数签名Java函数
“()Ljava/lang/String;”String f()
“(Ljava/lang/String;I)Jlong f(String i,int c)
“([B)V”void f(byte[] bytes)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有你就有时间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值