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;
}
}
}
}
相关文章推荐
- JavaBean, POJO, VO, DTO, DAO 异同
- java动态代理
- Java中如何创建线程
- Lombok 安装、入门 - 消除冗长的 java 代码
- struts2中的类型转换
- 每天进步一点点--java多线程
- Spring mvc怎么获取当前应用的url地址?即jsp页面中的${contextpath}怎么得到?
- Good article about Java thread state
- 韩顺平Spring框架学习,学习笔记(十二)
- Spring事务管理回顾——基本概念
- 韩顺平Spring框架学习,学习笔记(十一)
- Java 匿名内部类
- Java通过Executors提供四种线程池
- RxJava变换操作符:.concatMap( )与.flatMap( )的比较
- Spring 与代理有关属性详解
- 深入理解Java中的接口
- 每天进步一点点--java连接mysql
- java追加写入Excel之新建工作薄
- Java的final关键字
- Java文件下载