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开发之调用方法的更多相关文章

  1. Android NDK开发及调用标准linux动态库.so文件

    源:Android NDK开发及调用标准linux动态库.so文件 预备知识及环境搭建 1.NDK(native development Kit)原生开发工具包,用来快速开发C.C++动态库,并能自动 ...

  2. Android Studio NDK开发-JNI调用Java方法

    相对于NDK来说SDK里面有更多API可以调用,有时候我们在做NDK开发的时候,需要在JNI直接Java中的方法和变量,比如callback,系统信息等.... 如何在JNI中调用Java方法呢?就需 ...

  3. NDK开发之获得域和方法描述符

    在NDK开发之调用方法和NDK开发之访问域两篇博客中,我们在获得域ID和方法ID时都需要一个叫做描述符的参数,那么在实际开发中我们怎么知道我们要调用的域或者方法的描述符呢? 一个简单的方法就是使用Ja ...

  4. 简单的调用OpenCV库的Android NDK开发 工具Android Studio

    前言 本博客写于2017/08/11, 博主非专业搞安卓开发, 只是工作的需要倒腾了下Android NDK相关的开发, 博文中有什么不正确.不严格的地方欢迎指正哈    本文后续也许还会有删改, 就 ...

  5. android 串口开发第一篇:搭建ndk开发环境以及第一个jni调用程序

    一:ndk环境搭建 1:开发环境 我使用的是android studio 2.3.3版本,搭建ndk开发环境比较简单,打开File----Settings----Appearance&Beha ...

  6. AllJoyn+Android开发案例-android跨设备调用方法

    AllJoyn+Android开发案例-android跨设备调用方法 项目须要涉及AllJoyn开源物联网框架.前面主要了解了一些AllJoyn主要的概念.像总线,总线附件,总线对象,总线接口这种概念 ...

  7. Android NDK开发 JNI操作java构造方法,普通方法,静态方法(七)

    Android NDK开发 JNI操作java普通.静态.构造方法 1.Jni实例化一个Java类的实例jobject 1.通过FindClas( ),获取Java类的的jclass 2.通过GetM ...

  8. ios开发中全局变量设置和调用方法

    ios开发中,全局变量设置和调用方法如下:在AppDelegate.h文件中设置全局变量:@interface ***AppDelegate{NSString *myName;}@property ( ...

  9. .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)——转载

    原文链接:https://blog.walterlv.com/post/dotnet-high-performance-reflection-suggestions.html ***** 大家都说反射 ...

随机推荐

  1. BroadCastReceiver中耗时操作导致ANR

    現象:廣播接收器中進行耗時的I/O操作導致ANR. 查資料發現每次广播到来时 , 会重新创建 BroadcastReceiver 对象 , 并且调用 onReceive() 方法 , 执行完以后 该对 ...

  2. Oracle - Unprocessed Material

    create table kol.MTL_MATERIAL_TRANS_TMP_140325 as select * from MTL_MATERIAL_TRANSACTIONS_TEMP ; upd ...

  3. BZOJ3132: 上帝造题的七分钟

    3132: 上帝造题的七分钟 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 483  Solved: 222[Submit][Status] Desc ...

  4. 【转】JAVA字符串格式化-String.format()的使用--不错

    原文网址:http://blog.csdn.net/lonely_fireworks/article/details/7962171 常规类型的格式化 String类的format()方法用于创建格式 ...

  5. A. Difference Row

    A. Difference Row time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  6. Oracle体系结构图

    1 oracle数据库主要有数据文件database和数据库实例instance组成.用户通过用户进程链接到server process.在数据库启动的时候,需要依赖于参数文件parameter fi ...

  7. PHPcurl抓取AJAX异步内容(转载)

    PHPcurl抓取AJAX异步内容 其实抓ajax异步内容的页面和抓普通的页面区别不大.ajax只不过是做了一次异步的http请求,只要使用firebug类似的工具,找到请求的后端服务url和传值的参 ...

  8. poj 1556 The Doors(线段相交,最短路)

      The Doors Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7430   Accepted: 2915 Descr ...

  9. uva 10047 the monocyle (四维bfs)

    算法指南白书 维护一个四维数组,走一步更新一步 #include<cstdio> #include<cstring> #include<queue> #includ ...

  10. ubuntu下安装maven

    下载maven http://maven.apache.org/download.cgi 解压 tar -xzvf apache-maven-3.0.5-bin.tar.gz 配置环境变量 sudo ...