Android-jni(10)-jni调用java父类方法

jni调用java父类方法,在知道这个之后,我感觉jni能做的事真是厉害。我们一起来看看它与java的不同

一. jni调用java父类方法

先做个准备:

  1. 准备一个Java父类和子类,People和Beibi:
public class People {
    private static final String TAG = People.class.getSimpleName();

    /**
     * 说方法,在其中调用下sayAge
     */
    public void say() {
        Log.d(TAG, "people say");
        sayAge();
    }

    public void sayAge() {
        Log.d(TAG, "people say age");
    }
}

public class Beibi extends People {
    private static final String TAG = Beibi.class.getSimpleName();
    private int age;
    private String name;

    public Beibi(int age, String name) {
        this.age = age;
        this.name = name;
    }

    /**
     * 重写的父类说方法
     */
    @Override
    public void say() {
        Log.d(TAG, "beibi say:my name is " + name);
    }

    /**
     * 重写的父类说方法
     */
    @Override
    public void sayAge() {
        Log.d(TAG, "beibi say:my age is " + age);
    }
}
  1. 先来java方法来调用下say
 /*使用java来创建进行调用say方法*/
        People beibi = new Beibi(12, "小北鼻");
        beibi.say();
  • 输出
beibi say:my name is 小北鼻

这是我们正常情况下的多态的情况,不用说明了,至少我的理解是,正常使用情况下,只要实例是Beibi,在外部调用say方法,怎么调用都是Beibi的say,是调用不到People的say的。

接下来我们看jni,步骤:

  1. 创建Beibi的实例,并调用Beibi的say方法
  2. 依旧使用北鼻的实例,再调用People的say方法:使用CallNonvirtualVoidMethod

直接上代码,代码中有注释:

//1. 找Beibi的class
    jclass class_beibi = env->FindClass("shixin/ndkdemo/supermethod/Beibi");
    if (class_beibi == NULL) {
        LOGE("beibi class 寻找失败");
        return 1;
    }

    //2. 找Beibi的构造方法id,参数是int,String
    jmethodID jmethodID_init = env->GetMethodID(class_beibi, "<init>",
                                                "(ILjava/lang/String;)V");

    if (jmethodID_init == NULL) {
        LOGE("beibi 构造方法 寻找失败");
        return 1;
    }

    //3. 创建Beibi对象
    jobject obj_beibi = env->NewObject(class_beibi, jmethodID_init, age_, name_);
    if (obj_beibi == NULL) {
        LOGE("beibi 对象创建失败");
        return 1;
    }

    //4. 调用Beibi的say方法
    jmethodID jmethodID1_say = env->GetMethodID(class_beibi, "say", "()V");
    if (jmethodID1_say == NULL) {
        LOGE("beibi say方法寻找失败");
        return 1;
    }
    env->CallVoidMethod(obj_beibi, jmethodID1_say);

    /*···········下面来调用父类方法··········*/
    //5. 找到父类,People的class
    jclass class_people = env->FindClass("shixin/ndkdemo/supermethod/People");
    if (class_people == NULL) {
        LOGE("People class 寻找失败");
        return 1;
    }

    //6. 找到People的say方法id
    jmethodID jmethodID1_people_say = env->GetMethodID(class_people, "say", "()V");
    if (jmethodID1_people_say == NULL) {
        LOGE("people say方法 寻找失败");
        return 1;
    }

    //7. 调用父类方法 使用 CallNonvirtualVoidMethod 方法,参数:实例对象,class,方法id
    env->CallNonvirtualVoidMethod(obj_beibi, class_people, jmethodID1_people_say);
  • 输出:
D/Beibi: beibi say:my name is 大北鼻
D/People: people say
D/Beibi: beibi say:my age is 13

在输出就能看到:

  1. 咱们第一步调用Beibi实例的say方法正常调用
  2. 使用Beibi实例来调用父类People的方法,say真的是执行的父类的方法,然后在say中调用的sayAge又因为子类的重写调用的Beibi的sayAge

二. 总结

  1. 使用CallNonvirtualXXMethod可以调用传入实例obj与父类的class和methodid来调用父类的XX返回类型的方法
  2. 第一步仅在指定这个class和methodid的方法有效,对于实例方法中调用的被子类复写的方法依旧会调用到子类的方法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: linux-android-韦根驱动 jni.rar 是一个文件名,其中包含了与韦根驱动相关的文件。 Linux是一种开源的操作系统,广泛应用于各种计算机设备。它具有优秀的稳定性、安全性和可定制性。Android是基于Linux内核开发的移动操作系统,目前在智能手机等智能设备上广泛使用。 韦根(Wiegand)驱动是一种用于读取磁卡、感应卡等卡片数据的驱动程序。它使用韦根协议来传输卡片的数据。韦根协议是一种串行通信协议,常用于门禁系统、考勤系统等场景中。这个驱动程序可以使得Linux系统和Android系统能够读取和处理韦根卡片的数据。 JNIJava Native Interface)是一种Java编程语言的编程框架,用于在Java程序中调用其他语言(如C/C++)编写的本地代码。在这里,JNI用来链接Linux或Android系统的驱动程序和Java程序之间的接口。通过JNIJava程序可以调用韦根驱动的功能,读取韦根卡片的数据并进行相应的处理。 而 ".rar" 则是一种常见的文件压缩格式,它可以将多个文件或文件夹压缩成一个单独的文件,以方便传输和存储。所以,"linux-android-韦根驱动 jni.rar" 这个文件可能是包含了与韦根驱动功能相关的Linux和Android系统驱动程序以及JNI接口的压缩文件。 ### 回答2: "linux-android-韦根驱动 jni.rar" 是一个压缩文件,包含了用于在 Linux 和 Android 系统上支持韦根驱动的 JNIJava Native Interface)代码。 Linux 是一个开源的操作系统内核,Android 则是基于 Linux 内核开发的移动设备操作系统。韦根驱动是一种用于读取条码信息的通信协议,常用于条码扫描仪等设备。 这个压缩文件包含了 JNI 的相关代码,JNIJava 提供的机制,用于在 Java 程序中调用本地(C/C++)代码。由于韦根驱动是由本地代码实现的,所以需要使用 JNI 将其与 Java 程序进行交互。 在 Linux 系统上,可以使用这个 JNI 文件来编译并生成与韦根驱动相关的动态链接库(.so 文件),以便在 Java 程序中调用。在 Android 系统上,可以将这个 JNI 文件与其它 Android 项目一起编译,并将生成的 .so 文件集成到 Android 应用中,以实现对韦根驱动的调用。 这个压缩文件的具体内容可能包括 JNI 源代码、头文件以及必要的编译脚本。如果你想使用这个韦根驱动,你可能需要先解压这个压缩文件,然后参考其中的文档或指南,按照指导进行相应的编译和集成工作。 总之,"linux-android-韦根驱动 jni.rar" 是一个提供了在 Linux 和 Android 系统上支持韦根驱动的 JNI 代码文件,通过使用它,你可以将韦根驱动融入到你的 JavaAndroid 项目中,并实现对该驱动的功能调用。 ### 回答3: Linux是一种开源的操作系统,广泛用于服务器、桌面电脑和嵌入式设备。而Android是基于Linux内核开发的移动操作系统,主要运行于智能手机、平板电脑和其他便携式设备上。韦根驱动是一种用于与韦根协议进行通信的驱动程序,通过JNIJava Native Interface)将Java代码与本地代码进行交互。 在开发Android应用程序时,我们经常会使用JNI技术来调用C/C++编写的本地代码,以实现一些特定功能或与底层进行交互。在这个过程中,我们需要将本地代码打包成库文件,然后从Java层进行调用。 韦根驱动JNI.rar可能是一个包含了韦根协议通信所需的本地代码的压缩文件。其中可能包含了以C/C++语言编写的代码和一些与之相关的资源文件。通过解压缩这个文件,我们可以得到驱动程序所需的源代码和资源文件,从而进行进一步的开发和调试。 这个韦根驱动JNI.rar文件可能为开发者提供了一种在Android平台上与韦根协议设备进行通信的解决方案。通过将相关的代码集成到Android应用程序中,开发者可以实现与韦根协议设备之间的数据交互,从而实现特定的功能或满足特定的需求。 总之,Linux是操作系统,Android是基于Linux的移动操作系统,韦根驱动是用于与韦根协议进行通信的驱动程序,而韦根驱动JNI.rar可能是一个包含了韦根驱动的本地代码的压缩文件,用于在Android平台上实现与韦根协议设备的通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值