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 Native Interface (JNI) 中,Java 和 C/C++ 的数据类型有着明确的对应关系。理解这些对应关系是实现Java与C++交互的基础。 - **基本类型**: - Java 的 `boolean` 对应于 C/C++ 的 `jboolean` 类型,通常是...
1. **回调接口**:在Java中定义一个接口,用于表示需要在C++中调用的Java方法。 2. **注册回调**:在JNA接口中,使用`com.sun.jna.Library`的`registerCallback`方法注册这个Java方法作为回调。 3. **在VC++中调用...
- 在C++的函数中,使用JNI接口调用Java方法,传递数据。 这个"JNI数据传递demo"通过实际操作,帮助开发者理解如何在C/C++和Java之间高效、安全地传递不同类型的数据,进一步揭示了Android NDK编程的核心原理。通过...
在这个场景下,我们可以编写C/C++代码来解析和渲染SVG图像,然后通过JNI将这些功能暴露给Java层调用。 以下是实现这个目标的具体步骤: 1. **SVG解析**:首先,我们需要一个C/C++库来解析SVG文件。可以选择现有的...
3. **编写本地实现**:在生成的头文件中,你可以看到Java方法的C/C++原型。现在,你可以在这个文件或者单独的C/C++源文件中实现这个方法。 4. **编译本地代码**:将C/C++源文件编译成动态链接库(.so文件),...
在本示例"JniCallJava_ok2"中,我们将深入探讨如何使用JNI来调用Java类的静态方法和私有方法,这对于混合编程、性能优化或者利用已有的C/C++库时非常有用。 首先,我们需要理解JNI的基本概念。JNI是Java虚拟机(JVM...
3. **生成JNI头文件**:使用`javah`命令(在Android Studio中通常是`ndk-build`或`gradle`插件)根据Java类生成对应的C/C++头文件,其中包含了Java方法到C/C++函数的映射。 4. **编写C/C++源文件**:在生成的头文件...
这些函数通常会映射到Java层的方法,使得Java代码能够调用C/C++编写的数据库操作函数。例如,可能会有函数用于打开数据库连接、执行SQL语句、查询数据、插入记录等操作。 `sqlite_jni.h`文件则可能包含了`sqlite_...
JNI(Java Native Interface)是一种允许Java代码调用本地应用程序接口(Native Application Programming Interfaces,如 C 或 C++ 代码)的方法。在某些场景下,我们需要通过 JNI 调用来获取 Java 窗口的句柄,这在...
在这个"抽象类so调用示例"中,我们将探讨如何通过JNI来调用C/C++中的抽象类方法,并理解其背后的工作原理。 首先,让我们理解什么是抽象类。在面向对象编程中,抽象类是一种不能被实例化的类,它定义了一组接口,即...
JNA会自动映射Java方法调用到相应的C函数。 这个工具极大地简化了使用JNA的流程,避免了手动编写复杂的JNI代码,提高了开发效率。然而,需要注意的是,尽管JNAerator能自动生成大部分接口,但并非所有C特性都能被...
JNA通过一种映射机制,将Java方法与C/C++函数对应起来,简化了跨语言交互的过程。在“JNA实现回调及其他”这个主题中,我们将深入探讨JNA如何实现回调函数以及其在实际应用中的其他关键特性。 ### 1. JNA的基本原理...
接下来,`native`关键字用于标记一个方法是用非Java语言(如C/C++)实现的,通常与Java Native Interface (JNI)一起使用。JNI允许Java代码调用C/C++函数,扩展Java的功能。调用过程涉及加载动态链接库,执行本地方法...
6. **JNI 接口**:通过 JNI 接口,Java 层可以调用 C/C++ 函数。你需要在 Java 类中声明 `native` 关键字的方法,并在对应的 `.cpp` 文件中实现它们。使用 `javah` 工具或 IDE 自动生成头文件。 7. **生命周期管理*...
JNA通过映射Java方法到本地函数来实现这一功能,极大地简化了Java与本地库的交互。本项目提供了一个完整的Java调用JNA的示例工程,其中包含了必要的`jna.jar`库文件,为开发者提供了便捷的参考。 在Java中,与本地...
本地方法接口(JNI)允许Java代码调用非Java语言编写的代码,如C或C++编写的本地库。这对于那些需要访问操作系统底层功能或者调用已有C/C++库的应用非常有用。 - **JNI的作用**:通过JNI,开发者可以利用现有C/C++...
4. **集成到项目**:生成的Java类可以直接引入到Java项目中,与JNA库一起使用,调用本地库的函数就像调用Java方法一样简单。 JNAerator的优势: - **简洁性**:相比JNI,JNAerator生成的代码更简洁,更易于理解和...
它允许Java程序调用C/C++等本地代码,也可以让本地代码调用Java方法。在Areca的调用过程中,我们首先需要了解JNI的基本原理和使用方法。 1. **JNI的初始化与释放**: - 在JNIWrap类中,我们通常会实现初始化和释放...
- **MediaStore.java**:此文件位于`frameworks/base/core/java/android/provider/`目录下,提供了一系列用于访问媒体库的静态方法,这些方法背后都是通过ContentProvider实现的。 - **ContentResolver.java**:此...
JNA通过映射Java方法到本地库中的函数,实现了Java与C/C++等原生代码之间的无缝交互。这种交互方式比JNI更简洁,减少了开发工作量,特别是对于那些只需要简单调用本地库功能的情况。 在Java中使用JNA调用动态库通常...