JNI开发实践,小技巧板块,记录不常用的小知识点。
小技巧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;”
小技巧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不可行;