JNI - C 调用 Java

94 阅读1分钟

先定义一个 Java 类

package com.example.superlea.firstjni;

public class Student {

    public int age;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

cpp 文件中的写法

// 定义一个宏,指向 Java 类
#define STU_CLASS_PATH "com/example/superlea/firstjni/Student"

// 定义一个 c++ 函数
extern "C"
JNIEXPORT jstring JNICALL
fun_in_c(JNIEnv *env, jobject instance){
                 
    // step 1 获取类
    jclass clazz = env->FindClass(STU_CLASS_PATH);

    // step 2 获取类中的方法
    jmethodID method_init_id = env->GetMethodID(clazz,"<init>","()V");
    jmethodID method_set_id = env->GetMethodID(clazz,"setAge","(I)V");
    jmethodID method_get_id = env->GetMethodID(clazz,"getAge","()I");

    // step 3 创建类实例
    jobject obj = env->NewObject(clazz,method_init_id);

    // step 4 调用类实例的函数
    env->CallVoidMethod(obj,method_set_id,18);
    int age = env->CallIntMethod(obj,method_get_id);

	// 拼接字符串
    char tmp[4] = {0};
    sprintf(tmp,"%d",age);
    std::string hello = "student age = ";
    hello.append(tmp);

    return env->NewStringUTF(hello.c_str());
}

函数的注册省略...

最后先由 Java 层调用到 C 层的 fun_in_c 函数。

小问题记录:
char tmp[] = {0} 如果没指明大小,可能会报错; 改为 char tmp[4] = {0} 即可;

一个 char 一个字节! 参考:C++:char、int占多少字节