안 드 로 이 드 드라이브 여행 제4 장: 안 드 로 이 드 시스템 에서 JNI 방법 을 작성 하여 응용 프로그램 프레임 워 크 층 에 자바 인터페이스 액세스 하드웨어 를 제공 합 니 다.

10974 단어 android
우 리 는 리 눅 스 커 널 공간 에서 커 널 드라이버 와 사용자 공간 에서 하드웨어 추상 화 를 실현 하 는 방법 을 포함 하여 안 드 로 이 드 시스템 의 하드웨어 에 드라이버 를 만 드 는 방법 을 소개 했다.
층 인터페이스.이 두 가 지 를 실현 하 는 목적 은 하드웨어 액세스 인터페이스, 즉 안 드 로 이 드 의 Application Frameworks 층 에 하드웨어 서 비 스 를 제공 하 는 것 이다.
안 드 로 이 드 시스템 의 응용 프로그램 은 자바 언어 로 작 성 된 것 이 고 하드웨어 드라이버 는 C 언어 로 이 루어 진 것 입 니 다. 그러면 자바 인 터 페 이 스 는 어떻게 방문 하 는 지 알 고 있 습 니 다.
C 인 터 페 이 스 는 요?자바 가 JNI 방법 호출 을 제공 한 것 은 잘 알려 져 있 습 니 다. 마찬가지 로 안 드 로 이 드 시스템 에서 자바 응용 프로그램 은 JNI 를 통 해 하드웨어 추상 층 인 터 페 이 스 를 호출 합 니 다.
이 글 에서 우 리 는 안 드 로 이 드 하드웨어 추상 층 인 터 페 이 스 를 위 한 JNI 방법 을 소개 합 니 다.
하드웨어 서비스 제공.
 
step 1: frameworks / base / services / jni 디 렉 터 리 에 들 어가 서 새로운 comAndroid_server_HelloService. cpp 파일
#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/hello.h>

#include <stdio.h>



#include <android/log.h>



#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,"hello_stub",__VA_ARGS__)

#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,"hello_stub",__VA_ARGS__)



#define LOG_TAG "HelloService"



namespace Android

{

    /*                 ,  <hardware/hello.h>*/

    struct hello_device_t* hello_device = NULL;

    /*                       val   */

    static void hello_setVal(JNIEnv* env, jobject clazz, jint value) 

    {

        int val = value;

        LOGI("Hello JNI: set value %d to device.", val);

        if(!hello_device)

        {

            LOGI("Hello JNI: device is not open.");

            return;

        }



        hello_device->set_val(hello_device, val);

    }



    /*                       val   */

    static jint hello_getVal(JNIEnv* env, jobject clazz) {

            int val = 0;

            if(!hello_device)

            {

                LOGI("Hello JNI: device is not open.");

                return val;

            }

            hello_device->get_val(hello_device, &val);

        

            LOGI("Hello JNI: get value %d from device.", val);

        

            return val;

    }



    /*                        */

    static inline int hello_device_open(const hw_module_t* module, struct hello_device_t** device) 

    {

        return module->methods->open(module, HELLO_HARDWARE_MODULE_ID, (struct hw_device_t**)device);

    }





    /*      ID                   */

    static jboolean hello_init(JNIEnv* env, jclass clazz)

    {

        hello_module_t* module;



        LOGI("Hello JNI: initializing......");

           

            if(hw_get_module(HELLO_HARDWARE_MODULE_ID, (const struct hw_module_t**)&module) == 0) 

            {

                LOGI("Hello JNI: hello Stub found.");

                if(hello_device_open(&(module->common), &hello_device) == 0)

                {

                    LOGI("Hello JNI: hello device is open.");

                    return 0;

                }

        

                LOGE("Hello JNI: failed to open hello device.");

                return -1;

            }

            LOGE("Hello JNI: failed to get hello stub module.");

            return -1;

        }

    

          /*JNI    */

        static const JNINativeMethod method_table[] = 

        {

            {"init_native", "()Z", (void*)hello_init},

            {"setVal_native", "(I)V", (void*)hello_setVal},

            {"getVal_native", "()I", (void*)hello_getVal},

        };



       /*  JNI   */

       int register_Android_server_HelloService(JNIEnv *env)

       {

           return jniRegisterNativeMethods(env, "com/Android/server/HelloService", method_table, NELEM(method_table));

       }

   

};

 
step2:  같은 디 렉 터 리 에 있 는 onload. cpp 파일 을 수정 합 니 다. 먼저 namespace Android 에 register 를 추가 합 니 다.android_server_HelloService 함수 설명
namespace Android {
int register_Android_server_HelloService(JNIEnv *env);
};
JNI 에서onLoad 증가 registerAndroid_server_HelloService 함수 호출:
extern "C" jint JNI_onLoad(JavaVM* vm, void* reserved)
{
register_android_server_HelloService(JNIEnv *env);
}
step3:  같은 디 렉 터 리 에 있 는 Android. mk 파일 수정, LOCALSRC_FILES 변수 에 한 줄 추가:
LOCAL_SRC_FILES:= /
com_android_server_AlarmManagerService.cpp /
com_android_server_BatteryService.cpp /
com_android_server_InputManager.cpp /
com_android_server_LightsService.cpp /
com_android_server_PowerManagerService.cpp /
com_android_server_SystemServer.cpp /
com_android_server_UsbService.cpp /
com_android_server_VibratorService.cpp /
com_android_server_location_GpsLocationProvider.cpp /
com_android_server_HelloService.cpp /
onload.cpp
 

좋은 웹페이지 즐겨찾기