NDK基本数据类型及操作

1.数据类型

2.引用类型

 

3.数据和对象类型的基本操作

 

(1)string类型,在native中并不提供修改string类型函数,因为java中也是步伐修改存在的string的类型即string类型在java中不变类型的

jstring javaString;
javaString = (*env)->NewStringUTF(env, "Hello World!");


逆过程

const jbyte* str;
jboolean isCopy;
str = (*env)->GetStringUTFChars(env, javaString, &isCopy);


即让是对象(引用类型),我们就要去释放他的引用,这个细节是java程序员比较容易忘记的

(*env)->ReleaseStringUTFChars(env, javaString, str);


(2)数据类型

 

通过New<Type>Array类创建

type范围:Int, Char, Boolean, etc

jintArray javaArray;
javaArray = (*env)->NewIntArray(env, 10);
if (0 != javaArray) {
/* You can now use the array. */
}

 

接着就是操作数据中的元素

从java中拷贝

jint nativeArray[10];
(*env)->GetIntArrayRegion(env, javaArray, 0, 10, nativeArray);


逆过程

(*env)->SetIntArrayRegion(env, javaArray, 0, 10, nativeArray);


或者直接全部拷贝

 

<span style="font-family:TheSansMonoConNormal;color:#000000;FONT-VARIANT: normal; FONT-STYLE: normal; FONT-SIZE: 9pt">jint* nativeDirectArray;
<span style="font-family:TheSansMonoConNormal;color:#000000;FONT-VARIANT: normal; FONT-STYLE: normal; FONT-SIZE: 9pt">jboolean isCopy;</span>
</span>
nativeDirectArray = (*env)->GetIntArrayElements(env, javaArray, &isCopy);


别忘记释放

 

Release<Type>ArrayElemens


例如

(*env)->ReleaseIntArrayElements(env, javaArray, nativeDirectArray, 0);

记得数据的内容可能被我们已经修改了,所以追后的一个参数告诉系统如何处理


(3).字节类型

 字节类型是比较重要而且是需要注意的,因为字节没有大小,他需要你指定大小,在java中之所以string为不变类型就是这个原因吧,因为string保存必须指定内存大小

所以我们动态申请

unsigned char* buffer = (unsigned char*) malloc(1024);
...
jobject directBuffer;
directBuffer = (*env)->NewDirectByteBuffer(env, buffer, 1024);


我们直接申请了1024个字节来的buffer来构建jobject

 

接着我们也可以获取

unsigned char* buffer;
buffer = (unsigned char*) (*env)->GetDirectBufferAddress(env,
directBuffer);


记得free申请的内存

 

 

4.获取java class的属性

 

(1)获取class

jclass clazz;
clazz = (*env)->GetObjectClass(env, instance);


instance对应java的类型

 

(2)获取字段

 

jfieldID instanceFieldId;
instanceFieldId = (*env)->GetFieldID(env, clazz,"instanceField", "Ljava/lang/String;");


特殊的---静态类型

 

jfieldID staticFieldId;
staticFieldId = (*env)->GetStaticFieldID(env, clazz,"staticField", "Ljava/lang/String;");


对于对象GetStatic<Type>Field

jstring staticField;
staticField = (*env)->GetStaticObjectField(env, clazz, staticFieldId);


5.调用方法

调用方法有两种

思路 找到方法的ID,再call方法

 

(1)调用实例方法

instanceMethodId = (*env)->GetMethodID(env, clazz,"instanceMethod", "()Ljava/lang/String;");

(2)调用静态方法

staticMethodId = (*env)->GetStaticMethodID(env, clazz,"staticMethod", "()Ljava/lang/String;");


接着调用方法,方法会有返回类型,所以使用

(1)调用实例方法

Call<Type>Method 

如:

jstring instanceMethodResult;
instanceMethodResult = (*env)->CallStringMethod(env,instance, instanceMethodId);

(2)调用静态方法

CallStatic<Type>Field 

 

6.属性或类型的签名

如上我们

jstring staticField;
staticField = (*env)->GetStaticObjectField(env, clazz, staticFieldId);

 

其中staticFieldId是指定java中的类型的,这样系统才知道我们从java中拿了什么样的数据

 

就像

staticMethodId = (*env)->GetStaticMethodID(env, clazz,"staticMethod", "()Ljava/lang/String;");

告诉系统返回String

其实说了这么多,你只要明白,对于属性类型,他就要有个可以形容这个是什么类型属性的描述,而方法就用签名描述,我们可以使用javap

看看我们java对象的属性和方法的签名

 

 

 





 

 

 



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值