所有有关API可以在JNI的官网API查询
http://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/jniTOC.html
获取Class
jclass jcls = (*env)->GetObjectClass(env, jobj);
获取字段ID
jfieldID jfID = (*env)->GetFieldID(env, jcls, "name", "Ljava/lang/String;");
第一参数是Java 类对象,第二个参数是参数(或方法名),第三个参数是该参数(或方法)的签名
获取方法ID
jmethodID imID=env->GetMethodID(objectClass,"getName","()Ljava/lang/String;");
得到字段的值
JNIEnv指针,jobject对象,jfieldID字段ID
jstring jstr = (*env)->GetObjectField(env, jobj, jfID);
将jstring类型转换成字符指针
JNIEnv指针,jstring,isCopy 是否拷贝 NULL,JIN_TRUE,JIN_FALSE
需要使用ReleaseStringUTFChars来回收指针
char* cstr = (*env)->GetStringUTFChars(env, jstr, JNI_FALSE);
将字符指针转换成jstring类型
jstring new_str = (*env)->NewStringUTF(env, text);
将jstring类型的变量 , 设置到java 字段中
(*env)->SetObjectField(env, jobj, jfID, new_str);
调用方法
(*env)->CallVoidMethod(env, instance, jmID);
CallVoidMethod第四个参数开始是可变参数,传的是该方法的参数值
例如:
Activity中有一个方法
public void getName(String name,int age){
Log.e("JNI","my name is "+name+"and my age is"+age);
}
JNI中:
jmethodID jmID = jniEnv->GetMethodID(env, jcls, "getName", "(Ljava/lang/String;I)V");
char *name = "miaoyongjun";
jstring nameString = jniEnv->NewStringUTF(env, name);
(*env)->CallVoidMethod(env, instance, jmID, nameString, 24);
注意传String的时候不能直接传""字符串 ,需转换成jstring
调用构造函数
这里简单创建一个User类
public class User {
public void print(){
Log.e("User","c code make new object");
}
}
//获取jclass对象
jclass userClass = jniEnv->FindClass(env, "com/example/hellojnicallback/User");
//获取到构造函数
jmethodID userConstructMid = jniEnv->GetMethodID(env, userClass, "<init>", "()V");
//根据构造函数创建User对象
jobject user = jniEnv->NewObject(env, userClass, userConstructMid);
jmethodID userJmID = jniEnv->GetMethodID(env, userClass, "print", "()V");
jniEnv->CallVoidMethod(env, user, userJmID);
网友评论