• jni学习2.c++调用java函数


    jni函数除了要靠c++代码实现功能之外,在一些情况下还需要调用java里的方法来实现一些功能。

    解决问题:在jni函数中调用特定java类的特定方法。

    新建一个java类:

    1. package com.example.hello_cmake;
    2. import android.util.Log;
    3. public class TestCallBack {
    4. static {
    5. System.loadLibrary("native-lib");
    6. }
    7. //回调方法 里面调用了add
    8. public native void callBackAdd();
    9. public int add(int x,int y){
    10. Log.d("CALLBACK","add x= "+x+"y="+y);
    11. return x+y;
    12. }
    13. }

    在TestCallBack类中声明了两个函数,一个是add,这个函数显然是java方法;另一个是CallBackAdd,该方法是个jni函数。

    我们在该jni函数实现调用add的功能。

    1. extern "C"
    2. JNIEXPORT void JNICALL
    3. Java_com_example_hello_1cmake_TestCallBack_callBackAdd(JNIEnv *env, jobject jobj) {
    4. //1得到字节码
    5. jclass jclazz = env->FindClass("com/example/hello_cmake/TestCallBack");
    6. //2得到方法
    7. jmethodID jmethodIds = env->GetMethodID(jclazz,"add","(II)I");
    8. //3实例化
    9. jobject object = env->AllocObject(jclazz);
    10. //4调用方法
    11. env->CallIntMethod(object,jmethodIds,100,1);
    12. }

    从代码中可以看出,当jni函数需要调用java方面的东西的时候,env和jobj就派上用场了。

    第一步:得到字节码,也就是得到要调用的java方法所属的类。

    这里需要注意com.example.hello_cmake.TestCallBack是类的完整路径,但是识别的时候是以Linux标准进行的,因此里面的.要替换成/来表示路径。

    findclass方法是泛用性比较强的得到字节码的方式,通过该函数可以令jni函数任意调用java各个类里面的java方法。另外一种得到字节码的方式是:

    jclass a_class = env->GetObjectClass(instance);

    getobject方法只能得到jni函数所属的类的字节码,也就是说只能调用与该jni函数所属同类的java方法,泛用性大打折扣。

    第二步:得到要调用的java方法的id。

    这里注意参数中第二个是java方法的名字,第三个是java方法的签名。方法签名怎么查看可以参考这篇文章查看java函数签名

    第三步:实例化一个对象。

    在java中,类的成员方法必须以实例调用的形式调用,因此必须实例化一个对象,才能调用成员函数add。

    第四步:调用方法。

    调用方法的函数参数中,前两个分别为实例与方法的ID,后面的参数则是调用的java方法的参数。

    jni函数本身也算是java类的一个成员方法,在调用的时候,需要先实例化TestCallBack类,再进行调用。

  • 相关阅读:
    利用ORDERED_PREDICATES优化多个自定函数作为WHERE过滤条件
    Springboot中国古代史在线学习网站毕业设计源码260839
    【单片机毕业设计】【mcuclub-hj-015】基于单片机的水质监控的设计
    Vue不能watch数组和对象变化解决方案
    代码随想录算法训练营Day53|动态规划12
    angualr:CSS一个div内两个子元素的高度自适应
    C++ 修饰符类型
    live555源码分析一
    一文了解Web3.0真实社交先驱ERA
    串口数据解析
  • 原文地址:https://blog.csdn.net/m0_37872216/article/details/126147715