Android(安卓)FFmpeg开发(三)JNI访问Java变量和方法
16lz
2021-01-24
-
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 JNICALLJava_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 JNICALLJava_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 JNICALLJava_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 JNICALLJava_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 JNICALLJava_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 动态改变控件的位置的方法
- android属性动画,property animation-android property an
- Android菜单定制总结
- Android(安卓)使用弹出对话框,报Unable to add window错误
- 拍照-----------android系统 至关重要的功能
- Android程序全屏方法
- Android(安卓)webView自适应屏幕
- [Android]Recovery调用外部Shell脚本,Shell脚本使用ui_print方法
- Android(安卓)Wi-Fi Firmware(wcnss)修改方法(以QCOM为平台)