android c java_Android NDK开发:C操作Java层的数组

目录

0581b4b37c8a

相关文章

C创建数组

SetIntArrayRegion函数使用

#include "../com_itfitness_NdkDemo.h"

#include

JNIEXPORT jintArray JNICALL Java_com_itfitness_NdkDemo_createIntArray

(JNIEnv* env, jclass clazz, jint array_size) {

//创建一个大小为array_size的jintArray

jintArray jint_array = (*env)->NewIntArray(env,array_size);

//创建一个大小为array_size的jint类型的数组

jint *int_array = (jint*)malloc(array_size);

//给jint数组赋值

int i = 0;

for (i = 0; i < array_size; i ++) {

*(int_array + i) = i;

}

//将jint数组的值赋给jint_array

//(JNIEnv *env, jintArray array, jsize start, jsize len, const jint *buf);

//env:Java与C的桥梁

//array:被赋值的jintArray

//start:开始赋值的位置(我这是从第0个位置开始)

//len:赋值的长度(我这赋值array_size个数据)

//buf:数据源

(*env)->SetIntArrayRegion(env,jint_array,0,array_size,int_array);

//释放分配的jint数组的空间

free(int_array);

//返回jint_array

return jint_array;

}

ReleaseIntArrayElements函数使用

#include "../com_itfitness_NdkDemo.h"

#include

JNIEXPORT jintArray JNICALL Java_com_itfitness_NdkDemo_createIntArray

(JNIEnv* env, jclass clazz, jint array_size) {

//创建一个大小为array_size的jintArray

jintArray jint_array = (*env)->NewIntArray(env,array_size);

//创建一个大小为array_size的jint类型的数组

jint *int_array = (jint*)malloc(array_size);

//给jint数组赋值

int i = 0;

for (i = 0; i < array_size; i ++) {

*(int_array + i) = i;

}

//将jint数组的值赋给jint_array

//(JNIEnv *env, jintArray array, jint *elems, jint mode);

//env:Java与C的桥梁

//array:被赋值的jintArray

//elems:数据源

//mode:模式

// 0:将内容复制回来并释放原生数组

// JNI_COMMIT:将内容复制回来但是不释放原生数组,一般用于周期性的更新一个Java数组。

// JNI_ABORT:释放原生数组但是不将内容复制回来。

(*env)->ReleaseIntArrayElements(env,jint_array,int_array,JNI_COMMIT);

//释放分配的jint数组的空间

free(int_array);

//返回jint_array

return jint_array;

}

以上C函数对应的Java代码为:

public class NdkDemo {

static {

System.load("E:\\Project\\VS\\NDK操作数组\\x64\\Release\\NDK操作数组.dll");

}

public static void main(String[] args) {

int[] intArray = createIntArray(6);

for(int val:intArray){

System.out.print(val + " ");

}

}

/**

* 创建指定大小的int数组

* @param size

* @return

*/

public static native int[] createIntArray(int size);

}

执行结果为:

0581b4b37c8a

C对数组排序

#include "../com_itfitness_NdkDemo.h"

#include

/*--------------------冒泡排序---------------------*/

void bubleSort(int data[], int n) {

int i, j, temp;

//两个for循环,每次取出一个元素跟数组的其他元素比较

//将最大的元素排到最后。

for (j = 0; j < n - 1; j++) {

//外循环一次,就排好一个数,并放在后面,

//所以比较前面n-j-1个元素即可

for (i = 0; i < n - j - 1; i++) {

if (data[i] > data[i + 1]) {

temp = data[i];

data[i] = data[i + 1];

data[i + 1] = temp;

}

}

}

}

JNIEXPORT void JNICALL Java_com_itfitness_NdkDemo_sortArray

(JNIEnv* env, jclass clazz, jintArray jint_arr) {

//获取int数组的元素

jboolean iscopy = JNI_FALSE;//不复制

jint * array_elements = (*env)->GetIntArrayElements(env,jint_arr, iscopy);

//获取数组的长度

jsize arr_len = (*env)->GetArrayLength(env,jint_arr);

//冒泡排序

bubleSort(array_elements, arr_len);

//将排序后的数组赋值给jint_arr并将array_elements释放

(*env)->ReleaseIntArrayElements(env, jint_arr, array_elements, 0);

}

对应的Java代码为:

package com.itfitness;

public class NdkDemo {

static {

System.load("E:\\Project\\VS\\NDK操作数组\\x64\\Release\\NDK操作数组.dll");

}

public static void main(String[] args) {

int arr[] = {-1, 5, 23, 19, -20};

sortArray(arr);

for (int val : arr) {

System.out.print(val + " ");

}

}

public static native void sortArray(int[] arr);

}

执行结果为:

0581b4b37c8a

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值