`

JNI(C/C++调用Java父类/子类方法)

 
阅读更多

back>>

1. C/C++调用Java函数的形式


    - 调用实例方法的三种形式
    Call<TYPE>Method(jobject obj,jmethodID id,....);
    Call<TYPE>Method(jobject obj,jmethodID id,va_list lst);
    Call<TYPE>Method(jobject obj,jmethodID id,jvalue * v);

    例:

java中方法:
boolean function(int i , bouble d , char c){
    ···
}
//env->CallBooleanMethod(obj , id_function, 100L, 3.44 , L'3');//第一种调用函数形式
//第三种调用形式
jvalue * args = new jvalue[3];//存储参数的数组
args[0].i=100L;
args[1].d=3.44;
args[2].c=L'3';
env->CallBooleanMethod(obj , id_function , args);
delete [] args;//删除内存

 

    - 完整例子 参看C/C++调用Java代码 6

 

2. CallNonvirtual<TYPE>Method

    在JNI中定义的CallNonvirtual<TYPE>Method就能够对子类对象调用父类方法的功能。如果想要调用一个对象的父类方法,而不是子类的这个方法的话,就可以使用CallNonvirtual<TYPE>Method
    使用方式:
    首先取得父类及要调用的父类方法的jmethodID,然后传入到这个函数就能通过子类对象呼叫被覆写(override)的父类的方法

    例子:

    - Java代码

    Father.java

package video1;  
      
public class Father {  
     public void function(){  
          System.out.println("Father:function");  
     }  
}  

    Child.java

package video1;  
public class Child extends Father {        
     public void function() {  
          System.out.println("Child:function");  
     }      
}  

    TestNative.java

package video1;  
import java.util.Date;  
public class TestNative {  
    public native void sayHello();  
    public Father p = new Child();   
    public static void main(String[] args) {   
        System.loadLibrary("nativeCode");//Java类  中加载DLL,然后调用声明的native方法  
        TestNative tst=new TestNative();  
        tst.sayHello();  
    }  
} 

    - C/C++代码

#include "video1_TestNative.h"  
#include<iostream>  
using namespace std;  
JNIEXPORT void JNICALL Java_cn_itcast_TestNative_sayHello (JNIEnv *env, jobject obj){
  
    jfieldID id_p = env->GetFieldID  (clazz_TestNative,"p","Lvideo1/Father;");  
    jobject p = env->GetObjectField(obj,id_p);//取得属性  
      
    jclass clazz_Father = env->FindClass  ("video1/Father");//找到Father类  
    jmethodID id_Father_function = env->GetMethodID(clazz_Father,"function","()V");//获取Father类里面方法的ID  
    //调用方法,取得的是子类方法  
    env->CallVoidMethod(p,id_Father_function);     
    //相当于如下java代码  
    //Father p = tst.p;  
    //p.function();        
    env->CallNonvirtualVoidMethod(p,clazz_Father,id_Father_function);//调用父类方法  
      
    }  

 

分享到:
评论

相关推荐

    java与c++交互(JNI学习笔记)

    在Java Native Interface (JNI) 中,Java 和 C/C++ 的数据类型有着明确的对应关系。理解这些对应关系是实现Java与C++交互的基础。 - **基本类型**: - Java 的 `boolean` 对应于 C/C++ 的 `jboolean` 类型,通常是...

    JNA(java和vc++之间调用)

    1. **回调接口**:在Java中定义一个接口,用于表示需要在C++中调用的Java方法。 2. **注册回调**:在JNA接口中,使用`com.sun.jna.Library`的`registerCallback`方法注册这个Java方法作为回调。 3. **在VC++中调用...

    jni数据传递demo

    - 在C++的函数中,使用JNI接口调用Java方法,传递数据。 这个"JNI数据传递demo"通过实际操作,帮助开发者理解如何在C/C++和Java之间高效、安全地传递不同类型的数据,进一步揭示了Android NDK编程的核心原理。通过...

    利用jni技术来使Android5.0以下版本适配SVG特性

    在这个场景下,我们可以编写C/C++代码来解析和渲染SVG图像,然后通过JNI将这些功能暴露给Java层调用。 以下是实现这个目标的具体步骤: 1. **SVG解析**:首先,我们需要一个C/C++库来解析SVG文件。可以选择现有的...

    jni协议+自定义控件简单例子

    3. **编写本地实现**:在生成的头文件中,你可以看到Java方法的C/C++原型。现在,你可以在这个文件或者单独的C/C++源文件中实现这个方法。 4. **编译本地代码**:将C/C++源文件编译成动态链接库(.so文件),...

    JniCallJava_ok2

    在本示例"JniCallJava_ok2"中,我们将深入探讨如何使用JNI来调用Java类的静态方法和私有方法,这对于混合编程、性能优化或者利用已有的C/C++库时非常有用。 首先,我们需要理解JNI的基本概念。JNI是Java虚拟机(JVM...

    klogtest.7z

    3. **生成JNI头文件**:使用`javah`命令(在Android Studio中通常是`ndk-build`或`gradle`插件)根据Java类生成对应的C/C++头文件,其中包含了Java方法到C/C++函数的映射。 4. **编写C/C++源文件**:在生成的头文件...

    sqlite_jni.rar_This Is It

    这些函数通常会映射到Java层的方法,使得Java代码能够调用C/C++编写的数据库操作函数。例如,可能会有函数用于打开数据库连接、执行SQL语句、查询数据、插入记录等操作。 `sqlite_jni.h`文件则可能包含了`sqlite_...

    jni 获得java窗口句柄的C语言源代码

    JNI(Java Native Interface)是一种允许Java代码调用本地应用程序接口(Native Application Programming Interfaces,如 C 或 C++ 代码)的方法。在某些场景下,我们需要通过 JNI 调用来获取 Java 窗口的句柄,这在...

    klogtest1.zip

    在这个"抽象类so调用示例"中,我们将探讨如何通过JNI来调用C/C++中的抽象类方法,并理解其背后的工作原理。 首先,让我们理解什么是抽象类。在面向对象编程中,抽象类是一种不能被实例化的类,它定义了一组接口,即...

    将C头文件转为Java工具

    JNA会自动映射Java方法调用到相应的C函数。 这个工具极大地简化了使用JNA的流程,避免了手动编写复杂的JNI代码,提高了开发效率。然而,需要注意的是,尽管JNAerator能自动生成大部分接口,但并非所有C特性都能被...

    JNA实现回调及其他

    JNA通过一种映射机制,将Java方法与C/C++函数对应起来,简化了跨语言交互的过程。在“JNA实现回调及其他”这个主题中,我们将深入探讨JNA如何实现回调函数以及其在实际应用中的其他关键特性。 ### 1. JNA的基本原理...

    Java关键字解析.pdf

    接下来,`native`关键字用于标记一个方法是用非Java语言(如C/C++)实现的,通常与Java Native Interface (JNI)一起使用。JNI允许Java代码调用C/C++函数,扩展Java的功能。调用过程涉及加载动态链接库,执行本地方法...

    【Android Demo】Native Service

    6. **JNI 接口**:通过 JNI 接口,Java 层可以调用 C/C++ 函数。你需要在 Java 类中声明 `native` 关键字的方法,并在对应的 `.cpp` 文件中实现它们。使用 `javah` 工具或 IDE 自动生成头文件。 7. **生命周期管理*...

    jna java调用工程包括jna.jar文件

    JNA通过映射Java方法到本地函数来实现这一功能,极大地简化了Java与本地库的交互。本项目提供了一个完整的Java调用JNA的示例工程,其中包含了必要的`jna.jar`库文件,为开发者提供了便捷的参考。 在Java中,与本地...

    Java的四大核心技术

    本地方法接口(JNI)允许Java代码调用非Java语言编写的代码,如C或C++编写的本地库。这对于那些需要访问操作系统底层功能或者调用已有C/C++库的应用非常有用。 - **JNI的作用**:通过JNI,开发者可以利用现有C/C++...

    基于java的调用本地库 JNAerator.zip

    4. **集成到项目**:生成的Java类可以直接引入到Java项目中,与JNA库一起使用,调用本地库的函数就像调用Java方法一样简单。 JNAerator的优势: - **简洁性**:相比JNI,JNAerator生成的代码更简洁,更易于理解和...

    关于对areca调用的思路

    它允许Java程序调用C/C++等本地代码,也可以让本地代码调用Java方法。在Areca的调用过程中,我们首先需要了解JNI的基本原理和使用方法。 1. **JNI的初始化与释放**: - 在JNIWrap类中,我们通常会实现初始化和释放...

    深入理解android 卷II 第7章

    - **MediaStore.java**:此文件位于`frameworks/base/core/java/android/provider/`目录下,提供了一系列用于访问媒体库的静态方法,这些方法背后都是通过ContentProvider实现的。 - **ContentResolver.java**:此...

    jna调用动态库实例

    JNA通过映射Java方法到本地库中的函数,实现了Java与C/C++等原生代码之间的无缝交互。这种交互方式比JNI更简洁,减少了开发工作量,特别是对于那些只需要简单调用本地库功能的情况。 在Java中使用JNA调用动态库通常...

Global site tag (gtag.js) - Google Analytics