jni代码
//访问Java中的show方法
JNIEXPORT void JNICALL Java_com_zzy_ndkdemo_MainActivity_showString(JNIEnv *env, jobject instance, jstring s) {
//获取instance的类名称
jclass cls = (*env)->GetObjectClass(env,instance);
if(cls==NULL)
{
LOGD(“Class %s not found”);
}
//获取方法ID,第二个参数为类名称,第三个参数为方法名称,第三个参数为方法签名,详细参见签名对照表
jmethodID id =(*env)->GetMethodID(env,cls,“show”,"(Ljava/lang/String;)V");
if(id !=NULL)
{
//访问方法,第二个为类实例,第三个参数为方法ID,第四和第四以后为方法参数,
// 根据返回类型不同,调用不同的CallXXXMethod方法,xxx返回类型
(*env)->CallVoidMethod(env,instance,id,s);
}
}
2.4、jni访问java中的静态方法
java代码
public static void showStatic(String s){
Log.i(“MainActivity”,“show static:”+s);
}
public native void showStaticString(String s);
jni代码
//访问Java中的showStatic静态方法
JNIEXPORT void JNICALL Java_com_zzy_ndkdemo_MainActivity_showStaticString(JNIEnv *env, jobject instance, jstring s) {
//获取instance的类名称
jclass cls = (*env)->GetObjectClass(env,instance);
if(cls==NULL)
{
LOGD(“Class %s not found”);
}
//获取静态方法ID,第二个参数为类名称,第三个参数为方法名称,第三个参数为方法签名,详细参见签名对照表
jmethodID id =(*env)->GetStaticMethodID(env,cls,“showStatic”,"(Ljava/lang/String;)V");
if(id !=NULL)
{
//访问方法,第二个为类名称,第三个参数为方法ID,第四和第四以后为方法参数,
// 根据返回类型不同,调用不同的CallStaticXXXMethod方法,xxx返回类型
(*env)->CallStaticVoidMethod(env,cls,id,s);
}
}
1、从中我们可以看出静态方法比非静态方法的访问多加了一个static,访问函数由类实例,变成类引用。
2、如果静态方法不存在instance类中,我们可以通过FindClass进行访问,其中第二个参数为类的全路径
jclass cls = (*env)->FindClass(env, “com/zzy/ndkdemo/JniDemo”);
if (cls == NULL) {
LOGD(“Class %s not found”);
}
2.5、jni访问java中的字段
java代码
User user = new