JNI开发实践-小技巧

JNI开发实践,小技巧板块,记录不常用的小知识点。

  1. 小技巧1:函数签名,嵌套类表示方法
    B类是A类嵌套类,表示 JAVA路径时,用$分割

A类JAVA路径:com/starcor/tvos/settings/message/A
嵌套类BJAVA路径:com/starcor/tvos/settings/message/A/B
JAVA方法原型:B[] getAllMail(A)

JNI方法签名:
“(Lcom/starcor/tvos/settings/message/A;)[Lcom/starcor/tvos/settings/message/A$B;”

  1. 小技巧2:FindClass()局限性
    FindClass()如果不能查找到某个类A,是因为Java的class loader没有加载该类。以使用JNI经验看,系统层Sdk类和Java语言标准使用到的类是永久加载,FindClass()一定会调用成功。APK中自定义类不是永久加载,有的情况下FindClass()调用失败。
    FindClass()调用失败举例说明.
    事件回调场景,在JNI中,使用Java反射机制,创建新对象,给对象中的数据成员赋值,调用Java方法,传递新对象。
    这个过程,事件回调不在Jni主线程中执行。
    如果执行FindClass()查找自定义类,是调用失败的。原因是不在Jni主线程,class loader不会加载自定义类。
    尝试解决方法:
    1)Jni 主线程中,通过传参方式获取jobject ,NewGlobalRef()保存,在事件回调线程调用GetObjectClass()然后获取jclass;
    2)Jni主线程FindClass()获取jclass, 通过NewGlobalRef()保存jclass;在事件回调线程调用GetObjectClass()然后获取jclass;
    实验证明,方法1可行,方法2不可行;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值