jni数组操作

保存下代码,供以后参考:

使用数组参数:

static jint
usejniarray(JNIEnv *env, jclass clazz, jobjectArray fdArray, jintArray intArray)
{
    jclass FileDescriptor = env->FindClass("java/io/FileDescriptor");
    jfieldID fieldOffset = env->GetFieldID(FileDescriptor, "descriptor", "I");
    int numFds = (fdArray ? env->GetArrayLength(fdArray) : 0);
    int numInts = (intArray ? env->GetArrayLength(intArray) : 0);
    native_handle_t* handle = native_handle_create(numFds, numInts);
    int offset = 0;


    for (int i = 0; i < numFds; i++) {
        jobject fdo = env->GetObjectArrayElement(fdArray, i);
        if (fdo) {
            handle->data[offset++] = env->GetIntField(fdo, fieldOffset);
        } else {
            handle->data[offset++] = -1;
        }
    }
    if (numInts > 0) {
        jint* ints = env->GetIntArrayElements(intArray, 0);
        for (int i = 0; i < numInts; i++) {
            handle->data[offset++] = ints[i];
        }
        env->ReleaseIntArrayElements(intArray, ints, 0);
    }

}


jni返回对象数组:

static jobjectArray android_hardware_Camera_native_tv_getChannelInfo(JNIEnv *env, jobject thiz)
{
LOGD("TV-----android_hardware_tv_getChannelInfo");
sp<Camera> camera = get_native_camera(env, thiz, NULL);
    if (camera == 0) return NULL;


    uint32_t a[2] = {0};
a[0] = sizeof(a);
a[1] = TV_MSG_CHANNEL_INFO;


uint8_t *reply = NULL;
camera->TVCommand((uint8_t*)a, &reply);
//LOGD("TV-----android_hardware_tv_getChannelInfo11111111");


jobjectArray mm = NULL;


uint8_t *temp = reply;


if (reply){
int length = *((int *)reply);
reply += sizeof length;
int number = *((int *)reply);
        LOGD("TV-----android_hardware_tv_getChannelInfo length = %d", length);

if (number > 0)
{
mm = env->NewObjectArray(number, env->FindClass("java/lang/Object"), 0);
j_tv_channel *ptv = (j_tv_channel *)(reply + sizeof number);


//LOGD("TV-----android_hardware_tv_getChannelInfo number = %d, id = %d", number, ptv->_id);
jclass objectClass = env->FindClass("android/hardware/TV$TVChannel");  
jmethodID mtdConstruct = env->GetMethodID(objectClass, "<init>", "()V");

for (int i = 0; i < number; i++, ptv++)
{
jobject j_obj = env->NewObject(objectClass, mtdConstruct);
   jfieldID  j_name = env->GetFieldID(objectClass, "_name", "Ljava/lang/String;");
   jfieldID j_id = env->GetFieldID(objectClass, "_id", "I");
   env->SetObjectField(j_obj, j_name, env->NewStringUTF(ptv->_name));
env->SetIntField(j_obj, j_id, ptv->_id);
   env->SetObjectArrayElement(mm, i, j_obj);
}
}


delete []temp;
}

    return mm;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值