init.rc文件里面启动c++程序,通过jni调用java实现


功能:手机开机后要写个标志位。

已有实现,就是收到开机广播后,启动服务读取bp中的标志位(java代码需要等待ril准备好),

并把这个标志位写入到ap中(java代码调用c++)。

后来遇到的问题:实际应用中发现,接收开机广播等待的时间更长,需要提前写入ap时间。

解决方案:

在init.rc文件里面启动c++程序,通过jni调用java实现。

精简代码如下:

C++程序代码:

#define LOG_TAG "testmain"

#define LOG_NDEBUG 0

#include <dlfcn.h>
#include <cutils/log.h>
#include <utils/Log.h>
#include <jni.h>

using namespace android;

void wirtePsCaliValToKernel();

int main (int argc, char * argv[]){
    ALOGI("start c");
    wirtePsCaliValToKernel();
    ALOGI("start c end");
    return 0;
}

void wirtePsCaliValToKernel() {
    JavaVM* vm;
    JNIEnv* env;

    // start a VM
    JavaVMInitArgs args;
    JavaVMOption opt;

    opt.optionString =
        "-agentlib:jdwp=transport=dt_android_adb,suspend=n,server=y";

    args.version = JNI_VERSION_1_4;
    args.options = &opt;
    args.nOptions = 1;
    args.ignoreUnrecognized = JNI_FALSE;

    void* libdvm_dso = dlopen("libdvm.so", RTLD_NOW);
    ALOGE_IF(!libdvm_dso, "DdmConnection: %s", dlerror());

    void* libandroid_runtime_dso = dlopen("libandroid_runtime.so", RTLD_NOW);
    ALOGE_IF(!libandroid_runtime_dso, "DdmConnection: %s", dlerror());

    if (!libdvm_dso || !libandroid_runtime_dso) {
        goto error;
    }

    jint (*JNI_CreateJavaVM)(JavaVM** p_vm, JNIEnv** p_env, void* vm_args);
    JNI_CreateJavaVM = (typeof JNI_CreateJavaVM)dlsym(libdvm_dso, "JNI_CreateJavaVM");
    ALOGE_IF(!JNI_CreateJavaVM, "DdmConnection: %s", dlerror());

    jint (*registerNatives)(JNIEnv* env, jclass clazz);
    registerNatives = (typeof registerNatives)dlsym(libandroid_runtime_dso,
        "Java_com_android_internal_util_WithFramework_registerNatives");
    ALOGE_IF(!registerNatives, "DdmConnection: %s", dlerror());

    if (!JNI_CreateJavaVM || !registerNatives) {
        goto error;
    }

    if (JNI_CreateJavaVM(&vm, &env, &args) == 0) {
        jclass startClass;
        jmethodID readPsMeth;

        // register native code
        if (registerNatives(env, 0) == 0) {
            startClass = env->FindClass("android/hardware/Camera");
            if (startClass) {
                ALOGI(" startclass is ok");
                //readPsMeth = env->GetStaticMethodID(startClass, "getCurrentFocusPosition", "(I)V");
                readPsMeth = env->GetMethodID(startClass, "getCurrentFocusPosition", "()I");
                int result = -1;
                if (readPsMeth) {
                    ALOGI("readPsMeth is ok, result = %d ",  result);
                    result = env->CallStaticIntMethod(startClass, readPsMeth);
                    ALOGI("readPsMeth is ok end, result = %d ",  result);
                }else{
                    ALOGE("-->> readPsMeth is fail");
                }

            }else{
                ALOGE("startclass is fail");
            }
        }
    }
    return;

error:
    if (libandroid_runtime_dso) {
        dlclose(libandroid_runtime_dso);
    }
    if (libdvm_dso) {
        dlclose(libdvm_dso);
    }
}

Android.mk:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE:= testmain

LOCAL_SRC_FILES:=         testmain.cpp

LOCAL_C_INCLUDES :=

LOCAL_MODULE_TAGS := optional eng

LOCAL_SHARED_LIBRARIES += libcutils                             libutils                              liblog                              libandroid_runtime                           libnativehelper                           libdl
include $(BUILD_EXECUTABLE)

init.rc修改:

class 值为main时才能开机自动启动

service testmain /system/bin/testmain
	class main
	user root
	oneshot

end

				
时间: 2024-11-01 02:12:05

init.rc文件里面启动c++程序,通过jni调用java实现的相关文章

init.rc文件中面启动c++程序,通过jni调用java实现

</pre><p>注:假设是自己的myself.jar包,还要修改例如以下:</p><p>target/product/core_base.mk PRODUCT_BOOT_JARS := core:myself</p><p></p><p>功能:手机开机后要写个标志位. 已有实现.就是收到开机广播后,启动服务读取bp中的标志位(java代码须要等待ril准备好).并把这个标志位写入到ap中(java代码调用c++

android学习笔记--android启动过程之init.rc文件浅析

1.  init.rc文件结构文件位置:init.c  : /system/core/initinit.rc  : /system/core/rootdir 首先init.rc文件是以模块为单位的,每个模块里的内容都是一起执行的,模块分为3种类型:on.service.import.我们可以看下init.rc文件是怎么写的:1.import import /init.usb.rc import /init.${ro.hardware}.rc import /init.trace.rc 上面的内容

Android init.rc文件浅析

本文主要来自$ANDROID_SOURCE/system/init/readme.txt的翻译. 1 简述 Android init.rc文件由系统第一个启动的init程序解析.此文件由语句组成,主要包括了四种类型的语句:Action,Commands,Services,Options.在init.rc文件里一条语句一般是占领一行.单词之间是通过空格符来相隔的.假设须要在单词内使用空格,那么得使用转义字符"\",假设在一行的末尾有一个反斜杠,那么是换行折叠符号,应该和下一行合并成一起来

Android源码分析(十七)----init.rc文件添加脚本代码

一:init.rc文件修改 开机后运行一次: chmod 777 /system/bin/bt_config.sh service bt_config /system/bin/bt_config.sh class main user root group root oneshot 开机后等待android启动完成后再运行: service bt_config /system/bin/bt_config.sh class main user root group root disabled one

Android init.rc 文件解析

init.rc文件解析过程 我们已经知道init.rc的结构,应该可以想到解析init.rc的过程就是识别一个个section的过程,将各个section的信息保存下来,然后在init.c的main()中去执行一个个命令. android采用双向链表(关于双向链表详解见本文第三部分)来存储section的信息,解析完成之后,会得到三个双向链表action_list.service_list.import_list来分别存储三种section的信息上. 1. init.c中调用init_parse

Android 4.4 Init进程分析二:init.rc文件的解析

国际惯例,我们先看一下源码: http://androidxref.com/4.4_r1/xref/system/core/init/init.c#1039 1 init_parse_config_file("/init.rc"); 在init进程的main()函数里,会调用init_parse_config_file()方法解析init.rc脚本,注意这里传递的参数是根目录下的 "/init.rc"文件路径. init_parse_config_file()方法定

Android 的 init.rc 文件简介

init.rc由许多的Action和Service组成.每一个语句占据一行,并且各个关键字被空格分开. 由 # (前面允许有空格)开始的行都是注释行(comment) 一个actions 或 services 的开始隐含声明了一个新的段,所有commands 或 options 属于最近的声明.在第一个段之前的 commands 或 options 都会被忽略 每一个actions 和 services 都有不同的名字.后面与前面发生重名的,那么这个后面重名的将被忽略或被认为是一个错误. act

android中init.rc文件的解析问题

init.rc中文件里会通过import /init.${ro.hardware}.rc文件,这个ro.hardware应该是某个详细的属性.而这个ro.hardware赋值应该是在Init进程中赋值的. 这个ro.hardware值设置是在/system/core/init.c中实现的,其通过hardware来赋值.hardware首先被/proc/cpuinfo赋值.然后会检測comandline. 假设comandline中有參数为androidboot.hardware,那这个參数在in

init.rc文件 常见 描述

Action/Service 描述 on early-init 设置init进程以及它创建的子进程的优先级,设置init进程的安全环境 on init 设置全局环境,为cpu accounting创建cgroup(资源控制)挂载点 on fs 挂载mtd分区 on post-fs 改变系统目录的访问权限 on post-fs-data 改变/data目录以及它的子目录的访问权限 on boot 基本网络的初始化,内存管理等等 service servicemanager 启动系统管理器管理所有的