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的方式调用时, 会找不到该方法从而报错