您的位置:首页 > 编程语言 > Java开发

Adnroid ndk 中jni访问java方法、对象、成员变量

2016-05-26 17:13 615 查看
JNI文件夹下,C++源码
extern"C"
{
JNIEXPORTvoidJNICALLJava_ndk_test_JNI_accessJavaMethod(JNIEnv*env,jobjectobj)
{
jclassClassJNI=env->FindClass("ndk/test/JNI");
jmethodIDreturnStringID=env->GetMethodID(ClassJNI,"InstanceMethod","()Ljava/lang/String;");
jstringjstr=(jstring)env->CallObjectMethod(obj,returnStringID); //调用带返回参数的java方法
constchar*c_str=env->GetStringUTFChars(jstr,NULL); //4.将unicode编码的java字符串转换成C风格字符串
LOGI("java中的方法执行结果是:%s",c_str);

//调用有输入参数与返回值的方法
jmethodIDparamID=env->GetMethodID(ClassJNI,"paramMethod","(Ljava/lang/String;)Ljava/lang/String;");
jstringparam=env->NewStringUTF("这是java方法中需要的参数");
jstringjstr2=(jstring)env->CallObjectMethod(obj,paramID,param);
constchar*c_str2=env->GetStringUTFChars(jstr2,NULL);
LOGI("调用有输入参数与返回值的方法java中的方法执行结果是:%s",c_str2);

//调用java中多个参数的方法,并使用另一种查找方式
jmethodIDmuitleParamId=env->GetMethodID(ClassJNI,"MuitleParamMethod","(ILjava/lang/String;[I)Ljava/lang/String;");

jinta=119;
jstringtmp_jstr=env->NewStringUTF("liuzheyu");
jintArrayret=env->NewIntArray(3); //实例化一个g一维数组
jint*buffer=newjint[1024]; //固定数组,测试用,注意别溢出
for(inti=0;i<3;i++)
{
buffer[i]=i;
}
env->SetIntArrayRegion(ret,0,3,buffer); //从NativeType类型(jint)数组中,拷贝0~y数据到jintArray对象中

jstringjstr3=(jstring)env->CallObjectMethod(obj,muitleParamId,a,tmp_jstr,ret); //调用带返回参数的java方法
constchar*c_str3=env->GetStringUTFChars(jstr3,NULL); //4.将unicode编码的java字符串转换成C风格字符串
LOGI("调用java中多个参数的方法结果是:%s",c_str3);
env->DeleteLocalRef(ret);

/**
*测试访问静态方法
*/
jmethodIDstaticId=env->GetStaticMethodID(ClassJNI,"staticMethod","()Ljava/lang/String;");
jstringjstr_4=(jstring)env->CallObjectMethod(obj,staticId);
constchar*c_str4=env->GetStringUTFChars(jstr_4,NULL);
LOGI("访问java中的静态方法中结果是:%s",c_str4);

}
}

JNI文件夹下:java对象

packagendk.test;

/**
*JNI
*@authorAdministrator
*2016-05-22
*/
publicclassJNI
{

publicnativeStringgetString();

publicnativeintplus(inta,intb);

/**
*操作一维数组
*@parama
*@paramb
*@return
*/
publicnativeintoperateArray(int[]a,int[]b);

/**
*获取原生中的二维数组
*@paramrow
*@paramcol
*@return
*/
publicnativeint[][]get2Array(introw,intcol);

/**
*获取一个数组的对象
*@paramrow
*@paramcol
*@return
*/
publicnativeint[][]get2ArrayObject(int[][]a);

/**
*本地代码访问实例对象
*@paramobj
*/
publicnativestaticvoidaccessInstanceField(ClassObjectobj);

/**
*本地代码访问静态域
*/
privatenativestaticvoidaccessStaticField();

/**
*实例方法,在C++中调用
*@return
*/
publicStringInstanceMethod()
{
return"JNI中通过方法id来获取实例方法";
}
/**
*静态方法,在C++中调用
*@return
*/
publicstaticStringstaticMethod()
{
return"JNI中通过方法id来获取静态方法";
}
/**
*C++中测试调用带参数的方法
*@paraminfo
*@return
*/
publicStringparamMethod(Stringinfo)
{
returninfo;
}

/**
*c++能过原生方法调用带有多个不同类型的参数方法
*@parama
*@paramstr
*@paramarray
*@return
*/
publicStringMuitleParamMethod(inta,Stringstr,int[]array)
{
inttotal=0;
for(inti=0;i<array.length;i++)
{
total+=array[i];
}
Stringresult=a+str+total;
returnresult;
}

/**
*通过直接找类来访问java中的对象
*@paramobj
*/
publicnativevoidaccessJavaMethod();
}


java测试类对象:
packagendk.test;

/**
*在本地代码中进行修改
*@authorAdministrator
*
*/
publicclassClassObject
{

/**
*对应第一种方法:C++中访问java对象
*/
publicnativeClassObjectaccessJavaObject();

/**
*测试修改静态成员变量
*/
privatestaticintnum;

privateStringstr;

publicstaticintgetNum(){
returnnum;
}

publicstaticvoidsetNum(intnum){
ClassObject.num=num;
}

publicStringgetStr(){
returnstr;
}

publicvoidsetStr(Stringstr){
this.str=str;
}

}


Androidactivity类:
packagendk.test;

importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.widget.Button;
importandroid.widget.TextView;

publicclassMainActivityextendsActivity{

static
{
System.loadLibrary("NDKTest");//导入库
}

privateButtonjavaObjBtn;
JNIjni;

@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

TextViewtext=(TextView)findViewById(R.id.t1);
jni=newJNI();
Stringtmp1=jni.getString()+"和:"+jni.plus(2,7);
//text.setText(tmp1);

int[]a={1,2,3};
int[]b={4,5,6};
intmuitle=jni.operateArray(a,b);

Stringtmp2="操作数组之后:"+muitle;
text.setText(tmp1+tmp2);

int[][]array={{1,2,3},{4,5,6},{7,8,9}};
int[][]int2Array=jni.get2Array(3,3);

System.out.println("37-----------:"+int2Array[1][1]);

int[][]tmpArray=jni.get2ArrayObject(array);
System.out.println("40-----------:"+tmpArray[1][1]);

//操作对象
ClassObjectobj=newClassObject();
obj.setStr("刘胡来");
obj.setNum(26);
jni.accessInstanceField(obj);

/*ClassObjecto=obj.accessJavaObject();
System.out.println("测试修改对象,修改后名字:"+o.getStr()+":年龄:"+o.getNum());*/

javaObjBtn=(Button)findViewById(R.id.button1);
javaObjBtn.setOnClickListener(newBtnClick());

ButtonjavaMethodBtn=(Button)findViewById(R.id.button2);
javaMethodBtn.setOnClickListener(newBtnClick());
}

privateclassBtnClickimplementsOnClickListener
{

@Override
publicvoidonClick(Viewv){
switch(v.getId())
{
caseR.id.button2:
jni.accessJavaMethod();
/*inta=119;
Stringstr="liuzeyu";
int[]array={1,2,3};
jni.MuitleParamMethod(a,str,array);*/
break;
}

}

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