创建Java对象本质就是调用构造函数:
extern "C"
JNIEXPORT jobject JNICALL
Java_com_youngtr_jnievner_MainActivity_getPerson(JNIEnv *env, jobject thiz) {
// 获取 Person class
jclass p_cls = env->FindClass("com/youngtr/jnievner/Person");
// 获取构造函数id
jmethodID p_initMethod = env->GetMethodID(p_cls, "<init>", "(Ljava/lang/String;I)V");
// 调用构造函数
jobject person = env->NewObject(p_cls, p_initMethod, env->NewStringUTF("Cat"), 20);
return person;
}
extern "C"
JNIEXPORT jobjectArray JNICALL
Java_com_youngtr_jnievner_MainActivity_getPersons(JNIEnv *env, jobject thiz, jobjectArray names) {
// 获取 Person class
jclass p_cls = env->FindClass("com/youngtr/jnievner/Person");
// 获取构造函数id
jmethodID p_initMethod = env->GetMethodID(p_cls, "<init>", "(Ljava/lang/String;)V");
// 获取数组长度
jsize length = env->GetArrayLength(names);
// 创建 jni 数组 jObjectArray
jobjectArray j_array = env->NewObjectArray(length, p_cls, nullptr);
int i;
for (i = 0; i < length; ++i) {
jstring name = static_cast<jstring>(env->GetObjectArrayElement(names, i));
if (name == nullptr) {
return nullptr;
}
jobject obj = env->NewObject(p_cls, p_initMethod, name);
env->SetObjectArrayElement(j_array, i, obj);
}
return j_array;
}