Android中的JNI

JNI調用簡單梳理一下,留着慢慢完善。


java訪問C     邏輯相對簡單                   

javah -jni  com.android.client.Foo生成頭文件  包名+類名  Class文件
native引擎中AndroidRuntime類提供了一個registerNativeMethods函數    通過該函數定義Native函數和C函數的名稱映射關係
/work/project/kraft_m/libnativehelper/include/nativehelper/jni.h  每個platforms會有不同的定義
產生動態庫後java調用Native函數前,需要使用 System.loadLibrary("庫名")函數裝載該庫
 程序運行時,在調用native方法之前,程序員必須把C生成的動態鏈接庫裝載進去
Java不能訪問C中的變量   C中的變量對Java來說是私有的




C訪問Java
        C需要傳遞   需要類名  函數名稱      參數
        1。      獲取Java類的對象
                 clazz = env->getObjectClass(jobejct); C通過Java調用C接口調用Java
        2.       獲取Java中函數的Id值
                 jmethodid mid = env->getMethodId(clazz,"method_name","參數和返回值的類型");
                 參數在括號之內,返回值在括號之外
        3.       找到函數後,就可以調用函數了
                 env->CallXXXMethod(jobject,mid,ret);
        C中訪問Java中的變量
                clazz = env->getObjectClass(jobejct);
                找到變量的ID值
                jfieldID fid = env->GetFiledId(clazz,"filed_name","I");
                value = env->GetXXXFiled(env,jobejct,fid);第一第二參數爲原裝Java訪問C函數的兩個參數
                通過返回值獲得變量值
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章