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. hdu 4435

    一道枚举+搜索题: 很容易看出这道题目要求尽量不在大的城市里面建加油站: 所以从最大的城市开始枚举! 代码: #include<cstdio> #include<cmath> ...

  2. 李洪强iOS开发之-cocopods安装

  3. Android开源项目发现---ViewPager 、Gallery 篇(持续更新)

    1. Android-ViewPagerIndicator  鼎鼎大名,配合ViewPager使用的Indicator,支持各种位置和样式 项目地址:https://github.com/JakeWh ...

  4. insert into select 堵塞update

    mysql[192.168.5.15] blocking_thread[2286333] blocking_query[insert into temp_zhuyou_mktact_1(hotel_g ...

  5. BZOJ_1507_Editor_[NOI2003]_(Splay)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1507 简单区间操作的模板题 1507: [NOI2003]Editor Time Limit: ...

  6. 你所不知道的C++

    C++与C的不同 C++从诞生之初就号称和C是兼容的,正是这种兼容,使C++得以迅猛发展,然而也正是这种兼容,让C++背上了沉重的历史包袱.且不论其利弊,让我们来看看C++在兼容C的那部分中,与C语言 ...

  7. Muduo-Base-Atomic

    针对原子性操作进行封装, 下面是我们需要用到的原子操作函数, 有需要对此类进行扩展的话,可以根据下面的函数进行扩展. 原子操作需要加上一个编译选项 -march=i386(根据你CPU 的类型来写,也 ...

  8. java 正则表达式例子, 查找字符串

    import java.util.regex.Matcher;import java.util.regex.Pattern; public class Main { public static voi ...

  9. Javascript 查找字符串中出现最多的字符和出现的次数

    <script type="text/javascript"> //查找字符串中出现最多的字符和出现的次数 var str = 'Thatwheneying its o ...

  10. Keepass 2.x 的一些新发现

    近期将 Keepass 从 1.22 升级到了 2.24,经过一番折腾,发现有了很多新功能,也有一些之前被忽视的地方.再一次感叹这个软件的强大,向作者的无私奉献致敬! 其实,这个软件一直有 1.x 和 ...