JNI教程之数组操作

本文介绍了如何在Java中使用JNI创建和操作数组(如byte、boolean等),包括新数组的创建、数组元素的获取与释放、以及数组数据的复制。同时强调了及时释放内存以防止内存泄漏的重要性。
摘要由CSDN通过智能技术生成

1. 创建数组:New[type]Array

/**
新建数组
length: the array length.
RETURNS:
Returns a Java array, or NULL if the array cannot be constructed.
*/
jbyteArray javaArray = env->NewByteArray(1024*1024);
New[PrimitiveType]Array RoutinesArray Type
NewBooleanArray()jbooleanArray
NewByteArray()jbyteArray
NewCharArray()jcharArray
NewShortArray()jshortArray
NewIntArray()jintArray
NewLongArray()jlongArray
NewFloatArray()jfloatArray
NewDoubleArray()jdoubleArray

2. 对数组指针的操作:Get[type]ArrayElements,Release[type]ArrayElements

/**
获取字节数组中元素,返回一个这小这些元素的native数组指针
isCopy: 第二个参数为是否拷贝,JNI_TRUE为是,JNI_FALSE为否,不拷贝的话指针指向原地址,拷贝的话指针指向拷贝的副本地址。
RETURNS:
Returns a pointer to the array elements, or NULL if the operation fails.
*/
jbyte *nativeData = env->GetByteArrayElements(javaArray, 0);

指针用完要及时释放,否则gc的内存回收机制会认为该指针指向的内存还在被使用,从而造成内存泄漏。

/**
释放native数组指针
array: a Java array object.
elems: a pointer to array elements.
mode: 第三个参数在未拷贝副本的情况下无效,否则有3个模式:
0:	copy back the content and free the elems buffer
JNI_COMMIT:	copy back the content but do not free the elems buffer
JNI_ABORT:	free the buffer without copying back the possible changes
*/
env->ReleaseByteArrayElements(javaArray, nativeData, 0);

3. 复制成native数组进行操作:Get[type]ArrayRegion,Set[type]ArrayRegion

/**
将Java数组复制到C数组中
array: a Java array.
start: the starting index.
len: the number of elements to be copied.
buf: the destination buffer.c数组
*/
void Get[type]ArrayRegion(ArrayType array,jsize start, jsize len, NativeType buf);
//sample:
jbyte nativeArray[10];
env->GetByteArrayRegion(javaArray, 0, 10, nativeArray);

/**
从C数组向Java数组提交所作的修改
array: a Java array.
start: the starting index.
len: the number of elements to be copied.
buf: the source buffer.
*/
void Set[PrimitiveType]ArrayRegion(ArrayType array, jsize start, jsize len, const NativeType *buf);
//sample:
env->SetByteArrayRegion(javaArray, 0, 10, nativeArray);

4. 释放新建的数组 DeleteLocalRef

env->DeleteLocalRef(javaArray);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值