3Java程序JNI调用C++之修改属性调用方法

java code

package com.cloud.nativeTest;
/**
 * 全部应用。
 * 测试c++修改Java属性,并且呼叫Java方法
 */
public class TestModifyFieldAndCallMethod {
	public static void main(String[] args) {
		test();
	}
	private static void test() {
		System.loadLibrary("CNativeCode");
		TestModifyFieldAndCallMethod t = new TestModifyFieldAndCallMethod();
		t.callNative();
	}
	/**
	 * 声明调用的为本地代码
	 */
	private native void callNative();

	public int num = 10;
	public void showNumValue()
	{
		System.out.println("来自Java:showNumValue()---num值等于::"+num);
	}
	public int addValue(int value)
	{
		return num+value;
	}
}


 

 

c++ code

#include"com_cloud_nativeTest_TestModifyFieldAndCallMethod.h"
#include<iostream>
using namespace std;
JNIEXPORT void JNICALL Java_com_cloud_nativeTest_TestModifyFieldAndCallMethod_callNative(JNIEnv * env, jobject obj)
{
	cout<<"Hello Word"<<endl;//测试环境是否成功
	jclass clazz_Java = env->GetObjectClass(obj);//获得要修改的类对象
	jfieldID numObj = env->GetFieldID(clazz_Java,"num","I");//获得要修改的属性ID
	jint num = env->GetIntField(obj,numObj);//通过属性ID获得属性里的默认值
	cout<<"来自c++:修改前原来num值等于:";
	cout<<num<<endl;//控制台输出原始值
	env->SetIntField(obj,numObj,200L);//通过SetIntField给属性设置值

	jfieldID numObjTest = env->GetFieldID(clazz_Java,"num","I");//重新获得属性,并查看修改后的值
	jint numTest = env->GetIntField(obj,numObjTest);
	cout<<"来自c++:修改后num值等于:";
	cout<<numTest<<endl;

	jmethodID cshowNumValue = env->GetMethodID(clazz_Java,"showNumValue","()V");//获得要Call的方法对象ID,签名通过javap -s -p com.cloud.nativeTest.TestModifyFieldAndCallMethod获得方法签名
	env->CallVoidMethod(obj,cshowNumValue,"()V");//执行无返回值的Call

	jmethodID caddValue = env->GetMethodID(clazz_Java,"addValue","(I)I");
	jint returnValue = env->CallIntMethod(obj,caddValue,100);
	cout<<"来自c++:调用addValue()方法修改后num值等于:";
	cout<<returnValue<<endl;

}


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值