jni基本语法

作者: miaoyongjun | 来源:发表于2017-06-27 20:42 被阅读70次

所有有关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);

相关文章

网友评论

    本文标题:jni基本语法

    本文链接:https://www.haomeiwen.com/subject/ubtycxtx.html