codingWang / Issue

private space .Do NOT look at it.
3 stars 0 forks source link

JNI #25

Open codingWang opened 5 years ago

codingWang commented 5 years ago

JNI开发流程:

基础知识:

demo:

  1. 从C层返回字符串给Java
    char hello[20] = "Hello from C";
    return (*env)->NewStringUTF(env, hello);

2.访问Java类中的属性

   jclass cls = (*env)->GetObjectClass(env, jobj);//获取到类对象

    jfieldID fieldId = (*env)->GetFieldID(env, cls, "name", "Ljava/lang/String;");//类中的属性ID

    jstring str = (*env)->GetObjectField(env, jobj, fieldId);//获取值

    char *c_str = (*env)->GetStringUTFChars(env, str, JNI_FALSE);//转成C类型并处理
    char text[20] = "hello ";
    strcat(text, c_str);

    jstring new_str = (*env)->NewStringUTF(env, text);//再转成JNI类型

    (*env)->SetObjectField(env, jobj, fieldId, new_str);//重新赋值

    return new_str;

3.调用Java层的方法

  //jclass
    jclass cls = (*env)->GetObjectClass(env, jobj);
    //java method id
    jmethodID mid = (*env)->GetMethodID(env, cls, "genRandomInt", "(I)I");
    //call method
    jint random = (*env)->CallIntMethod(env, jobj, mid, 200);

4.访问静态方法

   jmethodID mid = (*env)->GetStaticMethodID(env, jcls, "getUUID", "()Ljava/lang/String;");

    //CallStatic<Type>Method
    jstring uuid = (*env)->CallStaticObjectMethod(env, jcls, mid);

    return uuid;

5.访问构造函数

6.处理回调

7.异常处理

8.多线程处理