天天看點

Android開發-----JNI反射kotlin靜态方法

google官方的<code>ndk-sample</code>中的<code>hello-jnicallback</code>項目, 在通過反射調用<code>JniHandler.java</code>類中的<code>getBuildVersion()</code>方法時,

由于是直接調用的java的<code>static</code>方法,并沒有出錯

Android開發-----JNI反射kotlin靜态方法

而在kotlin的文法中, 要實作java中<code>static</code>需要使用到<code>companion</code>關鍵字

Android開發-----JNI反射kotlin靜态方法

但是如果隻是增加了<code>companion</code>, 那麼在jni中通過<code>GetStaticMethodID()</code>擷取<code>getBuildVersion()</code>靜态方法會報如下錯誤

Android開發-----JNI反射kotlin靜态方法

方法一

網上搜尋了一些資料,查詢了相關API找到了如下方法(該方法參考Jni 反射 Kotlin 靜态内部類成員函數)

主要是通過反射先擷取<code>companion</code>靜态屬性對象, 然後再通過該對象調用其方法

Android開發-----JNI反射kotlin靜态方法

方法二

該方法是無意間想起kotlin中有一個<code>@JvmStatic</code>注解, 該注解注釋如下

Android開發-----JNI反射kotlin靜态方法
大意是說, 如果<code>@JvmStatic</code>注解用在函數上,那麼會生成一個靜态方法; 如果是用在屬性上, 那麼就會對應的生成靜态<code>setter/getter</code>方法

既然如此,那麼就可以使用該注解來實作jni反射kotlin中的<code>static</code>

Android開發-----JNI反射kotlin靜态方法

加上該注解後, jni中的代碼就可以寫為google官方sample中的方式

Android開發-----JNI反射kotlin靜态方法

方法二中使用到該注解來解決jni反射kotlin靜态的問題, 該注解的功能直接看位元組碼檔案比較清晰

Android開發-----JNI反射kotlin靜态方法

若不适用該注解,那麼位元組碼檔案如下圖, 可以看到并不會生成一個對應的static方法, 是以按照googl-sample的方式調用時, 會找不到該方法進而報錯

Android開發-----JNI反射kotlin靜态方法