Ubuntu 에 서 는 Android HAL 의 JNI 작성 방법 에 JAVA 액세스 하드웨어 서비스 인 터 페 이 스 를 제공 합 니 다.
1.Ubuntu Android 하드웨어 추상 층(HAL)모듈 추가 Linux 커 널 드라이버 방문글 을 참조 하여 하드웨어 추상 층 모듈 을 준비 하여 Android 시스템 미 러 파일 system.img 에 hello.default 모듈 이 포함 되 어 있 는 지 확인 합 니 다.
2.frameworks/base/services/jni 디 렉 터 리 에 들 어가 서 새로운 comandroid_server_HelloService.cpp 파일:
USER-NAME@MACHINE-NAME:~/Android$ cd frameworks/base/services/jni
USER-NAME@MACHINE-NAME:~/Android/frameworks/base/services/jni$ vi com_android_server_HelloService.cpp
comandroid_server_Hello Service.cpp 파일 에서 JNI 방법 을 구현 합 니 다.파일 의 명령 방법 에 주의 하 세 요,comandroid_server 접 두 사 는 패키지 이름 을 표시 합 니 다.하드웨어 서비스 HelloService 는 frameworks/base/services/자바 디 렉 터 리 에 있 는 come/android/server 디 렉 터 리 를 표시 합 니 다.즉,come.android.server.HelloService 라 는 명령 이 존재 합 니 다.여기 서 저 희 는 HelloService 류 의 묘 사 를 잠시 생략 하고 다음 글 에서 HelloService 류 로 돌아 가 겠 습 니 다.쉽게 말 하면 HelloService 는 자바 인 터 페 이 스 를 제공 하 는 하드웨어 액세스 서비스 클래스 입 니 다.
우선 해당 헤더 파일 을 포함 합 니 다:
#define LOG_TAG "HelloService"
#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>
이어서 helloinit、hello_getVal 과 hellosetVal 세 가지 JNI 방법:
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));
}
};
주의,helloinit 함수 에서 Android 하드웨어 추상 층 을 통 해 제공 하 는 hwget_module 방법 으로 모듈 ID 를 HELLO 로 불 러 옵 니 다.HARDWARE_MODULE_ID 의 하드웨어 추상 층 모듈,그 중 HELLOHARDWARE_MODULE_ID 는3.같은 디 렉 터 리 에 있 는 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(env);
.................................................................................................
}
이렇게 하면 Android 시스템 이 초기 화 될 때 이 JNI 방법 호출 표를 자동 으로 불 러 옵 니 다.
4.같은 디 렉 터 리 에 있 는 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
5.억 system.img 을 컴 파일 하고 다시 찾 습 니 다.
USER-NAME@MACHINE-NAME:~/Android$ mmm frameworks/base/services/jni
USER-NAME@MACHINE-NAME:~/Android$ make snod
이렇게 해서 다시 포장 한 system.img 미 러 파일 은 우리 가 방금 작성 한 JNI 방법 을 포함 합 니 다.즉,우 리 는 안 드 로 이 드 시스템 의 Application Frameworks 층 이 제공 하 는 하드웨어 서비스 HelloService 를 통 해 이러한 JNI 방법 을 호출 하고 낮은 층 의 하드웨어 추상 층 인 터 페 이 스 를 호출 하여 하드웨어 에 접근 할 수 있 습 니 다.앞에서 언급 한 바 와 같이 이 글 에서 저 희 는 HelloService 류 의 실현 을 잠시 소홀히 했 습 니 다.다음 글 에서 저 희 는 하드웨어 서비스 HelloService 를 어떻게 실현 하 는 지 설명 할 것 입 니 다.주목 해 주 십시오.
이상 은 JNI 방법 으로 안 드 로 이 드 하드웨어 추상 층 을 방문 하 는 절 차 를 작성 하고 관련 지식 을 계속 보충 하 며 안 드 로 이 드 소스 코드 를 연구 하 는 학생 들 에 게 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
PowerShell 기반 Ubuntu 시스템 사용 상세 정보본고는 주로 Ubuntu 16.04 LTS에 PowerShell을 설치하고 사용하는 방법을 소개한다.PowerShell Core는 마이크로소프트가 내놓은 크로스 플랫폼(Windows, Linux, macOS) 자동화...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.