C 代码创建 Java 对象

创建Java对象本质就是调用构造函数:

  1. 获取 jclass 对象
  2. 使用 jclass 对象获取构造函数
  3. 创建一个 jobject 对象即 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;
}

C 代码创建对象数组

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;
}