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需要傳遞 需要類名 函數名稱 參數
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函數的兩個參數
通過返回值獲得變量值