Android FFmpeg开发(三)JNI访问Java变量和方法

  • JNI访问Java成员变量

 1、首先创建成员变量:showText

 public String showText = "Hello World";

2、添加native方法accessField()

 public native void accessField();

选中accessField,按 Alt+Enter快捷添加.cpp中方法Java_com_example_myapplication_MainActivity_accessField

3、在JNI方法中修改showText的值

extern "C"
JNIEXPORT void JNICALL
Java_com_hooyah_hellondk_MainActivity_accessField(JNIEnv *env, jobject thiz) {
    // TODO: implement accessField()
    //获取类
    jclass jcla=env->GetObjectClass(thiz);
    //获取类的成员变量showText的id
    jfieldID jfied=env->GetFieldID(jcla,"showText","Ljava/lang/String;");
    jstring  showText=env->NewStringUTF("Hello NDK");
    //修改属性id对应的值
    env->SetObjectField(thiz,jfied,showText);
}

 

4、验证结果

 public String showText = "Hello World";
 TextView tv = findViewById(R.id.sample_text);
        
 accessField();
 tv.setText(showText);
  • JNI访问Java静态变量

1、添加静态属性和native方法

 public static String staticShowText="Hello World";
 public native void accessStaticField();

2、选中“accessStaticField”按住Alter+Enter会在cpp文件中自动生成对应的JNI方法

//修改java静态变量
extern "C"
JNIEXPORT void JNICALL
Java_com_hooyah_hellondk_MainActivity_accessStaticField(JNIEnv *env, jobject thiz) {
    // TODO: implement accessStaticField()
    //获取类
    jclass oClass = env->GetObjectClass(thiz);
    //获取静态变量id
    jfieldID staticFid = env->GetStaticFieldID(oClass, "staticShowText", "Ljava/lang/String;");

    //设置静态变量
    jstring after = env->NewStringUTF("static field update in jni");
    env->SetStaticObjectField(oClass, staticFid, after);
}

3、调用验证

   TextView tv = findViewById(R.id.sample_text);
   accessStaticField();
   tv.setText(staticShowText);
  • JNI访问Java非静态方法

1、添加Java非静态方法和 native方法

 public native String accessMethodData();

 public String getMethodData(String name) {
        Log.e("MainActivity", "name = " + name);
        return name;
    }

2、在JNI方法中做如下更改

extern "C"
JNIEXPORT jstring JNICALL
Java_com_hooyah_hellondk_MainActivity_accessMethodData(JNIEnv *env, jobject thiz) {
    // TODO: implement accessMethodData()
    //获取类
    jclass jCla = env->GetObjectClass(thiz);
    //获取方法id  第二个参数:方法名  第三个参数:(参数)返回值 的类型描述
    jmethodID methodID = env->GetMethodID(jCla, "getMethodData",
                                          "(Ljava/lang/String;)Ljava/lang/String;");
    jstring res = env->NewStringUTF("getMethodDataTest");
    jobject objRes = env->CallObjectMethod(thiz, methodID, res);
    return static_cast(objRes);
}

3、调用验证

 TextView tv = findViewById(R.id.sample_text);
 tv.setText(accessMethodData());
  • JNI访问Java非静态方法

1、添加Java静态方法和 native方法:

 private static int getRandomValue(int max) {
        return new Random().nextInt(max);
    }

 public native int accessStaticMethod(int max);

2、在JNI方法中做如下更改

extern "C"
JNIEXPORT jint JNICALL
Java_com_hooyah_hellondk_MainActivity_accessStaticMethod(JNIEnv *env, jobject thiz, jint max) {
    // TODO: implement accessStaticMethod()
    //获取类
    jclass jCla = env->GetObjectClass(thiz);
    //获取静态方法的id
    jmethodID methodID = env->GetStaticMethodID(jCla, "getRandomValue", "(I)I");
    //调用静态方法
    jint res = env->CallStaticIntMethod(jCla, methodID, max);
    //返回结果
    return res;
}

3、调用验证结果

 TextView tv = findViewById(R.id.sample_text);
 tv.setText(accessStaticMethod(100));
  • JNI访问Java构造方法

1、添加 native方法:

 public native Date accessConstructor();

2、在JNI方法中做如下更改

extern "C"
JNIEXPORT jobject JNICALL
Java_com_hooyah_hellondk_MainActivity_accessConstructor(JNIEnv *env, jobject thiz) {
    // TODO: implement accessConstructor()
    //得到TestClass对应的jclass
//    jclass jCla = env->FindClass("com/example/myapplication/TestClass");
    jclass jCla = env->FindClass("java/util/Date");
    //获取构造函数的methodId  构造函数为 void函数 对应的方法名为
    jmethodID methodID = env->GetMethodID(jCla, "", "()V");
    jobject jTestClass = env->NewObject(jCla, methodID);
    return jTestClass;
}

3、调用验证结果
 

 TextView tv = findViewById(R.id.sample_text);
 tv.setText(accessConstructor().toString());

 

参考文章:JNI访问Java变量和方法

你可能感兴趣的:(Android,ffmpeg开发)