保存下代码,供以后参考:
使用数组参数:
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;