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;
}