안 드 로 이 드 드라이브 여행 제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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.