JNI中如何在C++文件中调用java中的对象,举例说明

package jni;

import java.util.Date;


public class TestNative {


public native void sayhello();

public int number=10;
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.loadLibrary("NativeCode");
TestNative tst=new TestNative();
tst.sayhello();
System.out.println(tst.number);
}

}

1、要在C++中修改number属性的值

主要使用的方法有:

jclass  class=env->GetObjectClass(object);//得到当前类的class对象

jfieldID id_number=env->GetFieldID(class,"名字",“类型”);

jint number=env->GetIntFiled(class,id_number);

env->setIntField(class,id_number,"参数");

JNIEXPORT void JNICALL Java_jni_TestNative_sayhello(JNIEnv *env, jobject object){
//首先得到jclass对象,是后面得到属性和方法ID的基础
jclass clazz_TestNative=env->GetObjectClass(object);
jfieldID number_id=env->GetFieldID(clazz_TestNative,"number","I");
jint number=env->GetIntField(object,number_id); //得到java中number的值
cout<<"C++ "<<number<<endl;
env->SetIntField(object,number_id,100L);//设置就java中number的值为100

}

2、在C++中如何调用java的方法:

package jni;


import java.util.Date;


public class TestNative {


public native void sayhello();

public int number=10;

public double max(double num1,double num2){
return num1>num2?num1:num2;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.loadLibrary("NativeCode");
TestNative tst=new TestNative();
tst.sayhello();
System.out.println(tst.number);
}
}

对应的C++中的代码:

使用一下的方法

jclass class=env->GetObjectClass(object);

jmethod method=env->GetMethodID(jclass,"方法名",“(参数类型)返回值类型”);

env->Call<TYPE>Method(jclass,jmethod,参数列表);

JNIEXPORT void JNICALL Java_jni_TestNative_sayhello(JNIEnv *env, jobject object){

//首先得到jclass对象,是后面得到属性和方法ID的基础
jclass clazz_TestNative=env->GetObjectClass(object);

       jmethodID max_id=env->GetMethodID(clazz_TestNative,"max","(DD)D");
jdouble maxvalue=env->CallDoubleMethod(object,max_id,3.14,3.15);
cout<<maxvalue<<endl;

}

3、在C++调用类中其它对象的方法和属性

调用Father类中的方法

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

package jni;
public class Child  extends Father{
@Override
public void function() {
System.out.println("Child ...");
}
}

package jni;
import java.util.Date;
public class TestNative {
public native void sayhello();

public int number=10;

public double max(double num1,double num2){
return num1>num2?num1:num2;
}
Father p=new Child();

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.loadLibrary("NativeCode");
TestNative tst=new TestNative();
tst.sayhello();
System.out.println(tst.number);
}
}

对应的C++代码

JNIEXPORT void JNICALL Java_jni_TestNative_sayhello(JNIEnv *env, jobject object){

//首先得到jclass对象,是后面得到属性和方法ID的基础

        jclass clazz_TestNative=env->GetObjectClass(object);

        jfieldID p_id=env->GetFieldID(clazz_TestNative,"p","Ljni/Father;");
jobject p=env->GetObjectField(object,p_id); 得到Father对象
jclass p_father=env->FindClass("jni/Father"); 得到Father对象的class对象
jmethodID function_id=env->GetMethodID(p_father,"function","()V"); 得到Father对象的MethodID
env->CallVoidMethod(p,function_id); 调用Child 的function方法 提现了java中的多态
env->CallNonvirtualVoidMethod(p,p_father,function_id); 调用Father中的function方法

}

结果

Child ...
Father ...
10

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值