前言
在NDK开发中,jni和java方法互调也是常用的,下面做个笔记记录下
1.实例化java类,然后对方法赋值
JNIEXPORT jobject JNICALL Java_com_darren_ndk_day13_Simple1_createPoint
(JNIEnv *env, jclass jclz){
// jclz -> Simple1
// 获取 Point 的 class ,name = "全类名"
jclass point_clz = (*env)->FindClass(env,"com/darren/ndk/day13/Point");
// 构建 java 层的 Point 对象,构造函数的id , 构造方法 <init>
jmethodID j_mid = (*env)->GetMethodID(env,point_clz,"<init>","(II)V");
jobject point = (*env)->NewObject(env, point_clz, j_mid,11,22);
// 练习一下 y 重新付个值 ?调用 set 方法
j_mid = (*env)->GetMethodID(env, point_clz,"setY","(I)V");
/* va_list 集合
void (JNICALL *CallVoidMethodV)
(JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
// jvalue
void (JNICALL *CallVoidMethodA)
(JNIEnv *env, jobject obj, jmethodID methodID, const jvalue * args);
*/
(*env)->CallVoidMethod(env, point,j_mid,33);
return point;
}
2.获取java类的属性
JNIEXPORT void JNICALL Java_com_darren_ndk_day13_Simple1_callStaticMethod
(JNIEnv *env, jclass jclz){
// 2.获取 methodId
jmethodID j_mid = (*env)->GetStaticMethodID(env,jclz,"getUUID","()Ljava/lang/String;");
// 1. 调用 getUUID 的方法 static
jstring j_uuid = (*env)->CallStaticObjectMethod(env, jclz,j_mid);
// jstring -> c_str
char* c_uuid = (*env)->GetStringUTFChars(env,j_uuid,NULL);
// 回收,字符串回收
(*env)->ReleaseStringUTFChars(env,j_uuid,c_uuid);
printf("c_uuid = %s",c_uuid);
}