NDK开发之调用方法
与NDK开发之访问域中介绍的一样,Java中的方法也是分为两类:实例方法和静态方法。JNI提供了访问两类方法的函数,下面我们一起来看看怎么在C中访问Java中的方法。
我们的MainActivity中有两个方法,分别是:
private String instanceMethod(){
return "Instance Method";
}
private static String staticMethod(){
return "static Method";
}
那么我们该怎么在C中访问这两个方法呢?
步骤和访问域是一样的:
1.通过对象引用获得类
2.通过类获得方法ID
3.通过方法ID调用方法
下面按步骤来
1.通过对象引用获得类
clazz = (*env)->GetObjectClass(env, thiz);
2.通过类获得方法ID
JNI提供了用方法ID访问两类方法的途径,可以用给定实例的class对象获得方法ID,用GetMethodID函数获得实例方法的方法ID。与字段ID获取方法一样,两个函数的最后一个参数均表示方法描述符,在Java中它们表示方法签名。(为了提高应用性能,我们可以缓存方法ID)
instanceMethodID = (*env)->GetMethodID(env, clazz, "instanceMethod",
"()Ljava/lang/String;");
staticMethodID = (*env)->GetStaticMethodID(env, clazz, "staticMethod",
"()Ljava/lang/String;");
3.通过方法ID调用方法
instanceMethodResult = (*env)->CallObjectMethod(env,thiz,instanceMethodID);
staticMethodResult = (*env)->CallStaticObjectMethod(env,clazz,staticMethodID);
为了查看是否调用成功,我们需要把调用结果打印出来:
const jbyte* str1;
const jbyte* str2;
str1 = (*env)->GetStringUTFChars(env, instanceMethodResult, 0);
str2 = (*env)->GetStringUTFChars(env, staticMethodResult, 0);
LOGI("the string is :%s", str1);
LOGI("the string is :%s", str2);
完整代码是这样的:
void Java_com_example_jni_MainActivity_getMethod(JNIEnv* env, jobject thiz) {
jclass clazz;
jmethodID instanceMethodID;
jmethodID staticMethodID;
jstring instanceMethodResult;
jstring staticMethodResult;
clazz = (*env)->GetObjectClass(env, thiz);
// clazz = (*env)->FindClass(env,"com/example/jni/JavaClass");
instanceMethodID = (*env)->GetMethodID(env, clazz, "instanceMethod",
"()Ljava/lang/String;");
staticMethodID = (*env)->GetStaticMethodID(env, clazz, "staticMethod",
"()Ljava/lang/String;");
instanceMethodResult = (*env)->CallObjectMethod(env,thiz,instanceMethodID);
staticMethodResult = (*env)->CallStaticObjectMethod(env,clazz,staticMethodID);
//jstring转为C字符串然后打印出来
const jbyte* str1;
const jbyte* str2;
str1 = (*env)->GetStringUTFChars(env, instanceMethodResult, 0);
str2 = (*env)->GetStringUTFChars(env, staticMethodResult, 0);
LOGI("the string is :%s", str1);
LOGI("the string is :%s", str2);
}
打印结果:
Java和C之间的转换时代价较大的操作,在实际开发中我们应该尽量避免这种情况的出现。
版权声明:本文为博主原创文章,未经博主允许不得转载。若有错误地方,还望批评指正,不胜感激。
NDK开发之调用方法的更多相关文章
- Android NDK开发及调用标准linux动态库.so文件
源:Android NDK开发及调用标准linux动态库.so文件 预备知识及环境搭建 1.NDK(native development Kit)原生开发工具包,用来快速开发C.C++动态库,并能自动 ...
- Android Studio NDK开发-JNI调用Java方法
相对于NDK来说SDK里面有更多API可以调用,有时候我们在做NDK开发的时候,需要在JNI直接Java中的方法和变量,比如callback,系统信息等.... 如何在JNI中调用Java方法呢?就需 ...
- NDK开发之获得域和方法描述符
在NDK开发之调用方法和NDK开发之访问域两篇博客中,我们在获得域ID和方法ID时都需要一个叫做描述符的参数,那么在实际开发中我们怎么知道我们要调用的域或者方法的描述符呢? 一个简单的方法就是使用Ja ...
- 简单的调用OpenCV库的Android NDK开发 工具Android Studio
前言 本博客写于2017/08/11, 博主非专业搞安卓开发, 只是工作的需要倒腾了下Android NDK相关的开发, 博文中有什么不正确.不严格的地方欢迎指正哈 本文后续也许还会有删改, 就 ...
- android 串口开发第一篇:搭建ndk开发环境以及第一个jni调用程序
一:ndk环境搭建 1:开发环境 我使用的是android studio 2.3.3版本,搭建ndk开发环境比较简单,打开File----Settings----Appearance&Beha ...
- AllJoyn+Android开发案例-android跨设备调用方法
AllJoyn+Android开发案例-android跨设备调用方法 项目须要涉及AllJoyn开源物联网框架.前面主要了解了一些AllJoyn主要的概念.像总线,总线附件,总线对象,总线接口这种概念 ...
- Android NDK开发 JNI操作java构造方法,普通方法,静态方法(七)
Android NDK开发 JNI操作java普通.静态.构造方法 1.Jni实例化一个Java类的实例jobject 1.通过FindClas( ),获取Java类的的jclass 2.通过GetM ...
- ios开发中全局变量设置和调用方法
ios开发中,全局变量设置和调用方法如下:在AppDelegate.h文件中设置全局变量:@interface ***AppDelegate{NSString *myName;}@property ( ...
- .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)——转载
原文链接:https://blog.walterlv.com/post/dotnet-high-performance-reflection-suggestions.html ***** 大家都说反射 ...
随机推荐
- AD RMS Bulk Protection Tool 批量加密解密office文档
1.Active Directory Rights Management Services Bulk Protection Tool http://www.microsoft.com/zh-cn/d ...
- 深入浅出Z-Stack 2006 OSAL多任务资源分配机制
转自深入浅出Z-Stack 2006 OSAL多任务资源分配机制 一.概述 OSAL (Operating System Abstraction Layer),翻译为"操作系统抽象层&quo ...
- Android 使用SharedPreference来进行软件配置的存取
我们在安卓开发的时候不免需要记录用户键入的一些信息,比如账号和密码,用户使用软件的次数,上次打开软件的时间等等,为了保存这些配置,我们可以使用SharedPreference类保存他们. //使用Sh ...
- Android Adapter的getViewTypeCount和getItemViewType
Adapter的getViewTypeCount和getItemViewType 不同的项目布局(item layout) 我们再举一个稍微复杂的例子,在上例的list中加入一些分隔线 你需要做这些: ...
- 【HDOJ】2844 Coins
完全背包. #include <stdio.h> #include <string.h> ], c[]; int n, m; ]; int mymax(int a, int b ...
- ctagst简单应用,将Vim改造:Ctags,Taglist,Cscope,OmniCppComplete,SuperTab,Winmanager,NERDTree,MiniBufExplorer,vimrc
vim + ctags $ ctags #给同一个目录下的所有文件建立tags 这时在tags文件所在的目录下打开源文件阅读,vim就会自动调用tags文件.如果tags文件不在当前目录下,能在命令模 ...
- .net 与 javascript脚本的几种交互方法
1.asp.net呼叫js Response.Write("<script language=javascript>"); Response.Write("a ...
- 【2012.1.24更新】不要再在网上搜索eclipse的汉化包了!
转自:http://blog.csdn.net/gqqnb/article/details/6412364 2012.1.24更新 增加了“安装方法” eclipse是一个程序开发平台,它本身并不限制 ...
- python 零散记录(七)(下) 新式类 旧式类 多继承 mro 类属性 对象属性
python新式类 旧式类: python2.2之前的类称为旧式类,之后的为新式类.在各自版本中默认声明的类就是各自的新式类或旧式类,但在2.2中声明新式类要手动标明: 这是旧式类为了声明为新式类的方 ...
- 美工代码注意事项(html+div+css+js)
window.location.href的target控制 在使用框架时,经常会对框架子页面进行页面引导的情况,如果只是简单的设置location. href="",会使得整个页面 ...