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;

}


 

發佈了84 篇原創文章 · 獲贊 9 · 訪問量 38萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章