JNI和NDK筆記

 JNI與NDK
 JNIEnv jobject對象 訪問Java對象 保存對java對象的引用    靜態方法 第二個參數是jclass類
 jstring 是java本地類型,佔用16位,C語言中字符串僅佔用8位.
 javah -jni HelloJNI
 g++ -shared -I /usr/java/jdk1.5.0_22/include/ -I /usr/java/jdk1.5.0_22/include/linux/ HelloJNI.h -o hellojni.so
 這是因爲在jni.h中引用了jni_md.h頭文件,該頭文件和jni.h不在一個目錄下,所以我們還需要再指定jni_md.h的目錄
 Either change the C variants like
(*env)->FindClass(env, ...)
to the C++ variants, like
env->FindClass(...)
在C++文件中使用JNIEnv* env變量,直接使用env->即可
JNI就是java通過java虛擬機調用C函數
在C端 創建java對象,訪問類靜態成員,調用類靜態方法
查找待訪問的成員變量的java類的jclass值
若想獲取指定類的jclass值,調用JNI函數FindClass即可
成員變量的ID保存在jfieldID類型的變量中
GetStaticFieldID(clazz,"staticIntField","I"); C++
GetStaticFieldID(env,clazz,"staticIntField","I");c env要加上
若獲取構造方法的ID,方法名爲<init>  JNI函數NewObject
局部引用  NewGlobalRef 生成全局引用
獲取ID的時候傳入的都是類jclass
GetObjectClass返回類引用  靜態要加上static
invocation API   
GetStringUTFChars() 將JNI中的jstring轉換成 c/c++字符串
NewStringUTF 將字符串轉換成jstring
env指向JNI接口指針  可以調用JNI函數 CreateJavaVM 返回值爲0 成功
FindClass裝載Java類
NewStringUTF將UTF-8形式的C字符串轉換成java字符串
包含的文件jni.h/include和jni_md.h/include/win32 java虛擬機的庫文件/lib/jvm.lib
app_process的C++本地應用程序調用JNI Invocation API啓動運行
app_process 會先初始化Android runtime,然後運行Zygote進程 ZygoteInit類組成 app_process然後調用ZygoteInit 類的main方法,從而運行Zygote進程   Java虛擬機加載的時候,庫中查找java本地方法擁有相同簽名的本地函數,若一致,則將本地函數映射到JNI本地函數
解決本地加載緩慢的問題,RegisterNatives()的JNI函數,允許開發者將JNI本地函數與Java類的本地方法直接映射在一起
Java虛擬機檢查命名規範 多了的話會很緩慢 如果庫中JNI_OnLoad(手工映射 需要在 這個方法中調用RegisterNatives)被實現,Java虛擬機就不會進行匹配了
System.LoadLibrary方法被調用時,會調用JNI_OnLoad
GetEnv 判斷java虛擬機是否支持指定的JNI版本,然後將JNI接口指針設置到*env中
Java類的本地方法和JNI本地函數映射在一起
在Android系統中使用JNI_Onload函數直接映射本地方法  system server運行各種服務
LOCAL_SRC_FILES源碼文件 LOCAL_MODULE庫
register_android_server_
jniRegisterNativeMethods//JNIHelp.h中dalvik/libnativehelper/include/nativehelper/
實現在JNIHelp.c中
最終調用(*env)->RegisterNatives(env, clazz, gMethods, numMethods)
libc c頭文件  libm 數學庫頭文件 liblog log庫頭文件
class file has wrong version 50.0, should be 49.0
Please remove or make sure it appears in the correct subdirectory of the classpath.
java版本不對 49對於java 5 50對於java 6
javah -jni com.example.ndkexam.NDKExam
進入應用根目錄 然後執行ndk-build命令,自動編譯,生成本地庫
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章