Android底层开发(二)之JNI层

1 源文件LedHalService.cpp

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

#include <assert.h>

#include <jni.h>

#include <leds_hal.h>

struct led_control_device_t *led_hal_device = NULL;

static jboolean led_setOn(JNIEnv* env, jobject thiz, jint led)

{

LOGI("Led HAL JNI: led_setOn() is invoked.");

if (led_hal_device == NULL)

{

LOGI("Led HAL JNI: led_hal_device was not fetched correctly.");

return -1;

}

else

{

return led_hal_device->set_on(led_hal_device, led);

}

}

static jboolean led_setOff(JNIEnv* env, jobject thiz, jint led)

{

LOGI("Led HAL JNI: led_setOff() is invoked.");

if (led_hal_device == NULL)

{

LOGI("Led HAL JNI: led_hal_device was not fetched correctly.");

return -1;

}

else

{

return led_hal_device->set_off(led_hal_device, led);

}

}

static inline int led_control_open(const struct hw_module_t* module,

struct led_control_device_t** device)

{

return module->methods->open(module, LED_HARDWARE_MODULE_ID,

(struct hw_device_t**) device);

}

static jboolean led_init(JNIEnv *env, jclass clazz)

{

led_module_t* module;

LOGE("**********start find hal *********");

LOGE(LED_HARDWARE_MODULE_ID);

if (hw_get_module(LED_HARDWARE_MODULE_ID, (const hw_module_t**) &module)

== 0)

{

LOGI("LedService JNI: LED Stub found.");

if (led_control_open(&module->hw_module, &led_hal_device) == 0)

{

LOGI("LedService JNI: Got Stub operations.");

return 0;

}

}

LOGE("LedService JNI: Get Stub operations failed.");

return -1;

}

//定义JNI函数映射

static const JNINativeMethod methods[] =

{

{ "_init", "()Z", (void *) led_init },

{ "_set_on", "(I)Z", (void *) led_setOn },

{ "_set_off", "(I)Z", (void *) led_setOff }, };

//将JNI程序与java类库绑定

int register_led_hal_jni(JNIEnv* env)

{

static const char* const kClassName = "mobile/android/leds/hal/service/LedHalService";// 必须由该类调用当前的JNI程序库.

jclass clazz;

clazz = env->FindClass(kClassName);

if (clazz == NULL)

{

LOGE("Can‘t find class %s\n", kClassName);

return -1;

}

if (env->RegisterNatives(clazz, methods,

sizeof(methods) / sizeof(methods[0])) != JNI_OK)

{

LOGE("Failed registering methods for %s\n", kClassName);

return -1;

}

return 0;

}

//系统成功装载后会成功调用JNI_OnLoad函数   用于JNI模块初始化

jint JNI_OnLoad(JavaVM* vm, void* reserved)

{

JNIEnv* env = NULL;

jint result = -1;

if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK)

{

LOGE("GetEnv failed!");

return result;

}

register_led_hal_jni(env);

return JNI_VERSION_1_4;

}

2  Android.mk文件

# Android.mk

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := eng

LOCAL_MODULE:= led_hal_jni

# LOCAL_MODULE_PATH := /root/drivers/s3c6410_leds_hal/leds_hal_jni

LOCAL_MODULE_PATH := /home/litingting/妗岄潰/led_hal_jni

LOCAL_SRC_FILES:= LedHalService.cpp

LOCAL_SHARED_LIBRARIES := \

libandroid_runtime \

libcutils \

libhardware \

libhardware_legacy \

libnativehelper \

libsystem_server \

libutils \

libui \

libsurfaceflinger_client

LOCAL_C_INCLUDES += \

$(JNI_H_INCLUDE) \

hardware/leds_hal

LOCAL_PRELINK_MODULE := false

include $(BUILD_SHARED_LIBRARY)

3 建立链接再编译

先与安卓源码建立链接   ln -s     ..../leds_hal_jni   ......Android_SC/leds_hal_jni

再进行编译  mm  生成led_hal_jni.so  、

将led_hal_jni.so 传到开发板的/system/lib目录

时间: 2024-10-24 21:28:57

Android底层开发(二)之JNI层的相关文章

Android ndk开发swig编译jni接口配置文件(二)

之前写过一篇Android ndk开发swig编译jni接口.看这篇看不懂,看以去看看.c++与Java有些语言结构还是有一定区别,比如c++结构体,一些函数的返回值等都是有所不同,进行swig编译要进行一些预处理,也就是配置一下就行.下面说说几种情况. 一.一般情况下string,数组,枚举类型等配置Unix.i %module Survey %include "std_string.i" %include "arrays_java.i" %include &qu

Android底层开发之音频输入通道的软硬件分析

Android底层开发之音频输入通道的软硬件分析 我们都知道耳机Mic集成在一直的那种四段耳机Mic插头是Android设备上比较常用.但是也会有分开的情况,比较如果在普通的PC机中装Android系统,那么就是这种情况.所以就有必要对音频输入通道的软件硬件进行统一的分析一下,接下来分析一个实例. 该设备的硬件连接为:基于3157的模拟开关实现的 通道切换. 设备是完全靠硬件实现的,那么就没有软件的什么工作了.但是这并不是一个理想的实现方法,真下的实现方法应该是所有的Mic都是并行的,每个Mic

CSDN Android客户端开发(二):详解如何基于Java用Jsoup爬虫HTML数据

本文参考链接详细介绍如何使用Jsoup包抓取HTML数据,是一个纯java工程,并将其打包成jar包.希望了解如何用java语言爬虫网页的可以看下. 杂家前文就又介绍用HTTP访问百度主页得到html的string字符串,但html的文本数据如果不经过处理就是个文本字符串没有任何效果的.所谓的浏览器就是负责将文本的html"翻译"成看到的界面.在前文有介绍,这个csdn的客户端app分首页.业界.移动.研发.程序员.云计算五大类.以业界为例,http://news.csdn.net/ 

搭建android底层开发的环境读后感

本章主要介绍如何搭建android底层开发的环境,主要包括android应用程序开发环境.android NDK开发环境个交叉编译环境的搭建. 首先开发.测试和调试linux驱动.HAL程序库需要以下工具: 1.JDK6或以上版本: 2.Eclipse3.4或以上版本: 3.ADT: 4.CDT: 5.Android SDK: 6.Android NDK: 7.交叉编译环境: 8.Linux内核源代码: 9.Android源代码: 10.用于调试开发板的串口工具:minicom. 关于JDK的安

Android底层开发之字符绘制TextLayoutCache

源:Android底层开发之字符绘制TextLayoutCache

Android底层开发之耳机插拔与音频通道切换实例

Android底层开发之耳机插拔与音频通道切换实例 由于使用的是耳机 麦克分离式的耳机,所以要分别上报事件.在Android系统层耳机插孔的检测是基于/sys/class/switch/h2w/state的值来判断的(以4.4.4_r2为例子位于WiredAccessoryManager.java). 只要在内核中实现一个「或真或假」的基于switch类的h2w开关.Android系统就可以监听到插拔信息. 在播放音乐的时候插入耳机,使用tinymix(参考:Android音频底层调试-基于ti

Android开发实践:JNI层线程回调Java函数示例

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://ticktick.blog.51cto.com/823160/1358558 JNI是Java Native Interface的缩写,是Java平台的重要特性,使得Java代码可以方便地与C/C++代码编译生成的动态链接库进行交互.本文主要给出一份示例代码(工程文件见附件),描述如何在Android的JNI层开启一个线程,并在线程中回调Java层的函数. 代码主要分为Java层

【转】Android 底层开发的几点

我干了3年Android sdk开发,觉得到了瓶劲没法更进一步,于是花了一年多点时间,大概摸到点门径.根据前辈的经验,Android底层完全入门需要两年. 先说下我的入门过程:第零步,下载源码,我下的4.2的,框架层源码10G,内核2G多,ctags给框架层建的标签文件都有600M,当时让我有点震撼,用的vim+ctags+cscope来阅读,还算不错,架构挺清晰的. 第一步,我找到了一本好书<Android的设计与实现 第一卷>它讲了Android框架层的启动,初始化,服务框架初始化,Bin

搭建Android底层开发环境

为了开发linux驱动方便些,我们一般将linux作为Android的开发环境,那么就需要搭建Android的开发环境,下面是一些搭建Android底层时的心得: (1)安装JDK:除了普遍使用的下载压缩安装配置PATH 方法外,Ubuntu linux还提供了更简单的方法: #vim/etc/apt/sources.list后添加deb http://old-releases.ubuntu.com/ubuntu/ hardy multiverse源 # apt-get update # apt

Android NDK开发(二)——从Hello World学起

转载请注明出处:http://blog.csdn.net/allen315410/article/details/41805719  上篇文章讲述了Android NDK开发的一些基本概念,以及NDK的环境搭建,相信看过的朋友NDK开发环境搭建应该是没有问题了,还没有搭建或者不知道怎么搭建的朋友请点击这里.那么这篇文章,我们跟刚学Java编程语言一样,从世界知名程序"Hello World!"开始,开发出我们的第一个NDK程序. NDK目录简单介绍 在进行NDK开发之前,我们有必须熟悉