android jni (5)——Field & Method --> Accessing Mehtod
来源:互联网 发布:淘宝怎么查询历史价格 编辑:程序博客网 时间:2024/06/07 18:32
在java编程语言中有非静态成员函数和静态成员函数,JNI允许我们访问到java中的成员函数,然后再jni中调用,这里我就来举例说明在jni中是如何做到的。
我们先在java中定义2个成员函数,一个非静态的,一个是静态的,分别会把title的textView设置成不同的值:
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- mContext = this;
- bt1 = (Button)findViewById(R.id.button1);
- bt2 = (Button)findViewById(R.id.button2);
- tv = (TextView)findViewById(R.id.tv);
- tv.setText(""+si);
- bt1.setOnClickListener(new MyButtonListener());
- bt2.setOnClickListener(new MyButtonListener());
- }
- class MyButtonListener implements OnClickListener{
- public void onClick(View v) {
- if(v.getId() == R.id.button1 ){
- accessInstanceMethod("Instance Method Call");
- }
- if(v.getId() == R.id.button2 ){
- accessInstanceMethod("Static Method Call");
- }
- }
- }
- private void InstanceMethod(String str)
- {
- tv.setText(str);
- }
- private void static StaticMethod(String str)
- {
- tv.setText(str);
- }
- public native void accessInstanceMethod(String str);
- public native void accessStaticMethod(String str);
我们再来看下jni中是如何处理的:
- void
- Java_com_android_jni_MyJNI_accessInstanceMethod(JNIEnv *env,
- jobject obj, jstring jstr)
- {
- const jbyte *str;
- str = (*env)->GetStringUTFChars(env,jstr,NULL);
- if(str == NULL)
- return ;
- __android_log_print(ANDROID_LOG_INFO,"-JNI-","%s",str);
- (*env)->ReleaseStringUTFChars(env,jstr,str);
- jclass cls = (*env)->GetObjectClass(env,obj);
- jmethodID mid =
- (*env)->GetMethodID(env,cls,"InstanceMethod",
- "(Ljava/lang/String;)V");
- if(mid == NULL)
- return ;
- (*env)->CallVoidMethod(env,obj,mid,jstr);
- }
- void
- Java_com_android_jni_MyJNI_accessStaticMethod(JNIEnv *env,
- jobject obj, jstring jstr)
- {
- const jbyte *str;
- str = (*env)->GetStringUTFChars(env,jstr,NULL);
- if(str == NULL)
- return;
- __android_log_print(ANDROID_LOG_INFO,"-JNI-","%s",str);
- (*env)->ReleaseStringUTFChars(env,jstr,str);
- jclass cls = (*env)->GetObjectClass(env,obj);
- jmethodID mid =
- (*env)->GetStaticMethodID(env,cls,"StaticMethod",
- "(Ljava/lang/String;)V");
- if(mid == NULL)
- return ;
- (*env)->CallStaticVoidMethod(env,obj,mid,jstr);
- }
这边都比较简单,先是找到class,然后得到method ID,之后是根据method ID调用JAVA中的function
运行模拟器,点击不同的按钮观察title的textView:
-----------------------------------------------------------------------------------------------------
调用java的method就介绍到这,关于别的返回值的函数大家可以自己去尝试,用法都是差不多的。
- android jni (5)——Field & Method --> Accessing Mehtod
- 学习android JNI的那些事儿--------5. Field & Method --> Accessing Mehtod
- android jni ——Field & Method --> Accessing Field
- 学习android JNI的那些事儿--------4. Field & Method --> Accessing Field
- Butter Knife ——Android视图的字段(Field)和方法(Method)绑定
- JUnit Test——访问私有成员(Field和Method)
- Android 之Accessing Resource(资源调用)
- Android 之Accessing Resource(资源调用)
- GP学习(七)—Accessing raster workspaces
- android dex中method及field 65536打包问题
- Butter Knife Field and method binding for Android views
- 黑马程序员——反射——Class、Constructor、Field、Method及简单框架原理
- 笔记: Field 与 Method
- class&constructor&method&field
- Android——JNI
- Android—Jni初步
- Android JNI编程—JNI基础
- [转载] Android JNI编程—JNI基础
- nodeJs模块的理解以及加载方式
- JavaScript 面向对象的使用
- c# 获取项目的根目录
- H Language Overview
- Objective C 高级进阶 — GCD队列浅析(二)
- android jni (5)——Field & Method --> Accessing Mehtod
- 消息中间件 Apache Qpid 简介,第 1 部分
- 基于 OpenFlow 实现网络虚拟化
- DOS BAT批处理定义变量
- linux 中 一些函数
- C++ Primer 有感(标准库map类型)
- HQL: Hibernate查询语言
- 页面动态数据的滚动效果——jquery滚动组件(vticker.js)
- UML类图符号 各种关系说明以及举例