JNI学习

1.比如是一个AsesetManager类

private native final void init();

对应的c语言:

static void android_content_AssetManager_init(JNIEnv* env,jobject jobject)

那么JNIEnv对象,是一个java虚拟机(JVM),通过它就能访问JVM中的各种对象。jobject是该函数的对象。

 

2.生成头文件

javah -d ~/Desktop -jni com.xxxx.Foo

其中-d是指定文件生成的位置,-jni要放在后面,表示生成jni文件。

 

3.c中调用java中的方法

①对于java对象的类

cls=env->GetObjectClass(jobject)

②获取函数的id

env->GetMethodId(cls,"method name","(Ljava/lang/String;)V")
最后一个参数表示的是java的参数和返回值,其中Ljava/lang/String;表示的是参数为String,V表示的返回值为void.

如果是object,那么就对应 'L'+'packageName'+';'

这个是可以通过javap工具进行获取,p的意思是(params)参数

javap -s com/xxxx/xxxx

-s表示的签名(signature)

③开始进行调用函数

env->CallXXXMethod(jobject,mid,ret)

其中第三个参数ret保存的是返回值的变量。

 

4.c调用java中的属性

①cls=env->GetObjectClass(jobject)

②jfieldId fid=env->GetFiledId(cls,"filedname","I")

第三个参数是变量的类型

③value=env->GetXXXField(env,jobject,fid)

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值