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);//调用父类方法
}
分享到:
相关推荐
V. Eclipse+CDT+MinGW 进行JAVA调用C/C++ 34 一、 安装eclipse3.2。 34 二、 安装MinGW。 34 1、 下载MinGW 34 2、 安装 34 3、 安装版本 34 4、 选择安装的编译器 34 5、 选择安装路径,下一步 35 6、 等待下载...
Android JNI c/c++调用java的实例 近期通过研究SDL源码 得出Android JNI c/c++调用Java 无需新建虚拟机,这样省去很多步骤,这样调用Android JNI会变得非常容易,大家看下简单实例: 具体步骤如下 第一步获得:两个...
使用C/C++实现Java的Native方法接口(JNI)/ JNI编程(C/C++) 代码实例
C/C++中访问Java父类的方法 C/C++中访问/修改Java变量 Java中访问C/C++方法 Java中访问/修改C/C++变量 动态方式实现: C/C++中访问Java方法 C/C++中访问Java父类的方法 C/C++中访问/修改Java变量 Java中访问C/C++...
Android中C/C++调用Java代码
android jni c/java调用
JNI开发Java和C/C++互相传递List集合, 可以参考: Java从C/C++获取List集合对象:https://blog.csdn.net/niuba123456/article/details/80994166 Java传递List集合对象到C/C++ ...
Android JNI/NDK开发(2)JNI实现C/C++与Android/JAVA相互调用 http://blog.csdn.net/u014702653/article/details/71141423
通过jni完成java调用c/c++,包含c/c++生成Dll动态库
Android Studio3.0开发JNI流程,C++调用Java以及Java调用C++,C++/Java互相调用一个简单案例
项目中使用两种so打包技术Android.mk和Cmake默认为Cmake,实现了简单的C/C++和Java互通
Android Studio项目,此Demo实现Java调用C++函数,然后C++函数回调Java方法、纯C++直接调用Java方法,此为github地址链接
jni_c++调用java中的方法 文档中包含(c++与js互相调用的实现)
java 调用 dll 的方法,即JNI的使用,demo中有get()/set()方法,操作步骤详细,即使是没用过java的程序员按照步骤依然可以成功。
简单的通过jni在C/C++中调用Java的例子
这是一个简单的JNI开发中C层调用Java层函数的事例工程,对应的博客地址是:http://blog.csdn.net/hty1053240123/article/details/52126386
从 C/C++ 中调用 Java 代码,有一下几个步骤: 1.创建 JVM。调用 JNI_CreateJavaVM()。 2.寻找要调用的类。调用 FindClass()。 3.找到要调用的方法。调用 GetStaticMethodID()/GetMethodID()。 4.运行方法。...
本教程主要讲解java中如何调用C/C++,C/C++中如何调用java,并带Demo和调试指南
Android-JNI完整工程,实现c调用java和java调用c