先定义一个 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占多少字节