• 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变量和方法

更多相关文章

  1. android 动态改变控件的位置的方法
  2. android属性动画,property animation-android property an
  3. Android菜单定制总结
  4. Android(安卓)使用弹出对话框,报Unable to add window错误
  5. 拍照-----------android系统 至关重要的功能
  6. Android程序全屏方法
  7. Android(安卓)webView自适应屏幕
  8. [Android]Recovery调用外部Shell脚本,Shell脚本使用ui_print方法
  9. Android(安卓)Wi-Fi Firmware(wcnss)修改方法(以QCOM为平台)

随机推荐

  1. 介绍几个我常用的小工具
  2. 推荐:Android(安卓)网络通信框架Volley简
  3. ActivityGroup(和TabHost一样的功能)
  4. 第一个Google Map 应用
  5. Effective Android(安卓)UI - MVP
  6. 关于Android中Java与Javascript之间的传
  7. 如何让Android模拟器的Browser可以浏览In
  8. Android开源项目汇总
  9. 在Android下抓包
  10. Android(安卓)Studio 检测内存泄漏与解决