接著我們來看下JNI的編譯過程和調用流程,給出如:(具體見分享的JNI書籍,這個是windows上的一個圖,裡面的helloworld.dll在linux體系會變成helloworld.so)
<喎?http://www.bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+1rTQ0Ln9s8yjujwvcD4KPHA+sb612LT6wuux4NLryfqzyWhlbGxvd29ybGQuc2+2r8ysv+KjrNTaamF2YcDg1Pa80zwvcD4KPHA+c3RhdGljIHs8L3A+CjxwPlN5c3RlbS5sb2FkTGlicmFyeSg="HelloWorld");
} ,這樣在此類使用時,首先會將此動態庫載入到此進程的系統空間裡面,具體應用 查看linux 裡面 的 dlopen dlsym 函數。
之後,我們調用java類裡面的用native 聲明的函數,系統會自動去從動態庫去尋找,沒有找到,則會異常。
5.2.3 apk配置以及JNI編寫:
因為要設定時間,如果使用apk方式實現,那麼我們看到/dev/alarm 裝置是需要system許可權的,因此我們需要配置 android:sharedUserId="android.uid.system"
和使用system簽名產生apk,才能獲得system uid
關鍵步驟:(詳細的去本講內容裡面尋找)
AndroidManifest.xml 裡面:
Android.mk 配置為:
配置簽名為系統platform,如此便具有系統uid,隨後驗證。
JNI java端代碼:
cmd在src目錄使用javah -classpath . -jni com.example.systemtime.JNI 產生com_example_systemtime_JNI.h
複製com_example_systemtime_JNI.h到jni目錄,配置jni目錄下的android.mk
系統apk裡面的so提取出來了,放置在system/lib下面,因此我們測試需要eng版本,如果我們使用eclipse開發,預設是會將so儲存在apk裡面的。
完成後使用eng版本,
adb install -r (+apk檔案路徑)
adb remount
adb push (+ libtimetest.so 路徑 ) system/lib
啟動apk點擊ok,可以看到時間已被修改,ps查看進程看到
system 3024 144 310688 28208 ffffffff 400f624c S com.example.systemtime
Userid 變為syste m 了