<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                在Android系統中,通常把硬件訪問服務的JNI方法實現在frameworks/base/services/jni目錄中,因此,我們把實現了硬件訪問服務FregService的JNI方法的com_android_server_FregService.cpp文件也保存在這個目錄中,它的內容如下所示。 **frameworks/base/services/jni/com_android_server_FregService.cpp** ~~~ #define LOG_TAG "FregServiceJNI" #include "jni.h" #include "JNIHelp.h" #include "android_runtime/AndroidRuntime.h" #include <utils/misc.h> #include <utils/Log.h> #include <hardware/hardware.h> #include <hardware/freg.h> #include <stdio.h> namespace android { /*設置虛擬硬件設備freg的寄存器的值*/ static void freg_setVal(JNIEnv* env, jobject clazz, jint ptr, jint value) { /*將參數ptr轉換為freg_device_t結構體變量*/ freg_device_t* device = (freg_device_t*)ptr; if(!device) { LOGE("Device freg is not open."); return; } int val = value; LOGI("Set value %d to device freg.", val); device->set_val(device, val); } /*讀取虛擬硬件設備freg的寄存器的值*/ static jint freg_getVal(JNIEnv* env, jobject clazz, jint ptr) { /*將參數ptr轉換為freg_device_t結構體變量*/ freg_device_t* device = (freg_device_t*)ptr; if(!device) { LOGE("Device freg is not open."); return 0; } int val = 0; device->get_val(device, &val); LOGI("Get value %d from device freg.", val); return val; } /*打開虛擬硬件設備freg*/ static inline int freg_device_open(const hw_module_t* module, struct freg_device_t** device) { return module->methods->open(module, FREG_HARDWARE_DEVICE_ID, (struct hw_device_t**)device); } /*初始化虛擬硬件設備freg*/ static jint freg_init(JNIEnv* env, jclass clazz) { freg_module_t* module; freg_device_t* device; LOGI("Initializing HAL stub freg......"); /*加載硬件抽象層模塊freg*/ if(hw_get_module(FREG_HARDWARE_MODULE_ID, (const struct hw_module_t**)&module) == 0) { LOGI("Device freg found."); /*打開虛擬硬件設備freg*/ if(freg_device_open(&(module->common), &device) == 0) { LOGI("Device freg is open."); /*將freg_device_t接口轉換為整型值返回*/ return (jint)device; } LOGE("Failed to open device freg."); return 0; } LOGE("Failed to get HAL stub freg."); return 0; } /*Java本地接口方法表*/ static const JNINativeMethod method_table[] = { {"init_native", "()I", (void*)freg_init}, {"setVal_native", "(II)V", (void*)freg_setVal}, {"getVal_native", "(I)I", (void*)freg_getVal}, }; /*注冊Java本地接口方法*/ int register_android_server_FregService(JNIEnv *env) { return jniRegisterNativeMethods(env, "com/android/server/FregService", method_table, NELEM(method_table)); } }; ~~~ 在函數freg_init中,首先通過Android硬件抽象層提供的hw_get_module函數來加載模塊ID為FREG_HARDWARE_MODULE_ID的硬件抽象層模塊。在2.3.3小節中,我們已經介紹過hw_get_module函數是如何根據FREG_HARDWARE_MODULE_ID來加載Android硬件抽象層模塊freg的了。函數hw_get_module最終返回一個hw_module_t接口給freg_init函數,這個hw_module_t接口實際指向的是自定義的一個硬件抽象層模塊對象,即一個freg_module_t對象。 函數freg_init接著調用函數freg_device_open來打開設備ID為FREG_HARDWARE_DEVICE_ID的硬件設備,而后者又是通過調用前面獲得的hw_module_t接口的操作方法列表中的open函數來打開指定的硬件設備的。在2.3.2小節中,我們將硬件抽象層模塊freg的操作方法列表中的open函數設置為freg_device_open,這個函數最終返回一個freg_device_t接口給freg_init函數。 函數freg_init最后把獲得的freg_device_t接口轉換成一個整型句柄值,然后返回給調用者。 函數freg_setVal和freg_getVal都是首先把參數ptr轉換為一個freg_device_t接口,然后分別調用它的成員函數set_val和get_val來訪問虛擬硬件設備freg的寄存器val的值。 注意:在調用freg_setVal和freg_getVal這兩個JNI方法之前,調用者首先要調用JNI方法freg_init打開虛擬硬件設備freg,以便可以獲得一個freg_device_t接口。 文件接著定義了一個JNI方法表method_table,分別將函數freg_init、freg_setVal和freg_getVal的JNI方法注冊為init_native、setVal_native和getVal_native。文件最后調用了jniRegisterNativeMethods函數把JNI方法表method_table注冊到Java虛擬機中,以便提供給硬件訪問服務FregService使用。 硬件訪問服務FregService的JNI方法編寫完成之后,我們還需要修改frameworks/base/services/jni目錄下的onload.cpp文件,在里面增加register_android_server_FregService函數的聲明和調用。 **frameworks/base/services/jni/onload.cpp** ~~~ #include "JNIHelp.h" #include "jni.h" #include "utils/Log.h" #include "utils/misc.h" namespace android { ...... int register_android_server_FregService(JNIEnv* env); }; using namespace android; extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved) { ...... register_android_server_FregService(env); return JNI_VERSION_1_4; } ~~~ onload.cpp文件實現在libandroid_servers模塊中。當系統加載libandroid_servers模塊時,就會調用實現在onload.cpp文件中的JNI_OnLoad函數。這樣,就可以將前面定義的三個JNI方法init_native、setVal_native和getVal_native注冊到Java虛擬機中。 最后,進入到frameworks/base/services/jni目錄中,打開里面的Android.mk文件,修改變量LOCAL_SRC_FILES的值。 ~~~ LOCAL_SRC_FILES += \ ...... com_android_server_FregService.cpp \ onload.cpp ~~~ 修改好這個文件之后,我們就可以執行mmm命令來重新編譯libandroid_servers模塊了。 ~~~ USER@MACHINE:~/Android$ mmm ./frameworks/base/services/jni/ ~~~ 編譯后得到的libandroid_servers.so文件就包含有init_native、setVal_native和getVal_native這三個JNI方法了。 至此,硬件訪問服務FregService的實現就介紹完了。下面我們繼續介紹如何在系統進程System中啟動它。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看