NDK开发-对数组的操作

先看java层的编写

public class JniDemo {
	    int[] arrays = {4, 3, 12, 45, 12, 12, 14, 15, 17, 18};
    	Father[] objArray = {new Father(), new Father(), new Father()};
		    // 操作数组
    	public native void processArray();
}

Father类

import android.util.Log;

public class Father {

    public void function(){
        Log.i("dhy", "Native call");
    }
}

再来看native层的操作

// 定义一下log,方便调试
#define TAG "dhy33333333"
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__);
// 操作数组
extern "C"
JNIEXPORT void JNICALL
Java_com_univer_androidyellowbook_JniDemo_processArray(JNIEnv *env, jobject thiz) {
    // 1.首先获取数组的field_id
    jfieldID fid_arrays = env -> GetFieldID(env->GetObjectClass(thiz), "arrays", "[I");

    // 2.获取java中数组对象
    jintArray jint_arr = (jintArray) env -> GetObjectField(thiz, fid_arrays);

    // 3.根据对象获取指针
    jint* int_arr = env->GetIntArrayElements(jint_arr, NULL);
    LOGE("1111")
    // 4.获取数组长度
    jsize len = env->GetArrayLength(jint_arr);


    // 新建一个jintarray对象
    jintArray jint_array_temp = env->NewIntArray(len);
    // 获取jint_array_temp对象的指针
    jint* int_array_temp = env->GetIntArrayElements(jint_array_temp, NULL);
    LOGE("2222")

    // 计数
    jint count = 0;
    // 将偶数位存入int_arr_temp中
    for (jsize j=0;j<len; j++){
        if(j%2==0){
            int_array_temp[count++] = int_arr[j];
        }
    }
    // 打印int_arr_temp内存中的数组
    for(jsize k=0; k<count; k++){
        cout<<int_array_temp[k] << ",";
    }

    cout<<endl;
    // 将数组中的一段3-7设置为一定的值,并且打印出来
    jint* buffer = new jint[4];
    for (int n=0; n<4; n++){
        buffer[n] = n + 1;
    }

    // 将buffer这个数组中设置到数组从3开头长度为4的值中
    env->SetIntArrayRegion(jint_arr, 3, 4, buffer);
    LOGE("3333")


    cout<<"重新获取的数组中3-7的值变成了:";
    for (int m=0; m< len; m++){
        cout<<int_arr[m]<<",";
    }
    cout<<endl;
    LOGE("4444")
    // c++的排序
    std::sort(int_arr, int_arr+len);
//    env->SetObjectField(thiz, fid_arrays, jint_arr);
    // 释放数组指针
    env->ReleaseIntArrayElements(jint_arr, int_arr, JNI_ABORT);
    LOGE("55555")


    // 操作对象数组
    jfieldID fid_obj_array = env->GetFieldID(env->GetObjectClass(thiz), "objArray", "[Lcom/univer/androidyellowbook/Father;");
    // 获取对象
    jobjectArray job_array = (jobjectArray)env->GetObjectField(thiz, fid_obj_array);
    // 从对象中获取索引值为1的对象Father
    jobject jobj = env->GetObjectArrayElement(job_array, 1);
    // 获取father对象的Class对象
    jclass clazz_father = env->GetObjectClass(jobj);
    // 获取father对象的method_id;
    jmethodID fid_func = env->GetMethodID(clazz_father, "function", "()V");
    // 调用function方法
    env->CallVoidMethod(jobj, fid_func);

    // 在本地创建一个大小为10的对象数组,对象的初始化都是jobj
    jobjectArray job_arr_temp = env->NewObjectArray(10, env->GetObjectClass(jobj), jobj);

    // 获取本地对象数组的第4个对象
    jobject jobj_temp = env->GetObjectArrayElement(job_arr_temp, 3);

    // 调用对象中的function方法
    env->CallVoidMethod(jobj_temp, fid_func);
}

注意

如果这个native方法是static的话,那么传入native层的就是jclass
如果是public那就是jobject
引入一个so可以在多个类里写入native方法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值