您的位置:首页 > 编程语言 > C语言/C++

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

2011-11-15 13:56 232 查看
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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: