Android开发-----JNI反射kotlin静态方法

Google官方sample中的问题

google官方的ndk-sample中的hello-jnicallback项目, 在通过反射调用JniHandler.java类中的getBuildVersion()方法时,
由于是直接调用的java的static方法,并没有出错

而在kotlin的语法中, 要实现java中static需要使用到companion关键字

但是如果只是增加了companion, 那么在jni中通过GetStaticMethodID()获取getBuildVersion()静态方法会报如下错误

JNI反射Kotlin静态方法的方式

方法一
网上搜索了一些资料,查询了相关API找到了如下方法(该方法参考Jni 反射 Kotlin 静态内部类成员函数)
主要是通过反射先获取companion静态属性对象, 然后再通过该对象调用其方法

方法二
该方法是无意间想起kotlin中有一个@JvmStatic注解, 该注解注释如下

大意是说, 如果@JvmStatic注解用在函数上,那么会生成一个静态方法; 如果是用在属性上, 那么就会对应的生成静态setter/getter方法

既然如此,那么就可以使用该注解来实现jni反射kotlin中的static

加上该注解后, jni中的代码就可以写为google官方sample中的方式

关于@JvmStatic注解

方法二中使用到该注解来解决jni反射kotlin静态的问题, 该注解的功能直接看字节码文件比较清晰

若不适用该注解,那么字节码文件如下图, 可以看到并不会生成一个对应的static方法, 所以按照googl-sample的方式调用时, 会找不到该方法从而报错

posted @ 2021-12-28 23:37  予有荣焉  阅读(710)  评论(0编辑  收藏  举报