</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++)。

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

解决方式:在init.rc文件中面启动c++程序,通过jni调用java实现。精简代码例如以下:C++程序代码:</p><p></p><pre code_snippet_id="517675" snippet_file_name="blog_20141113_2_8082170" name="code" class="plain">#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


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

  1. Android init.rc文件浅析

    Android init.rc文件浅析 分类: Android2012-04-13 18:00 13149人阅读 评论(2) 收藏 举报 androidservicepathactionsocketc ...

  2. Android中的 init.rc文件简介

    init.rc脚本是由Android中linux的第一个用户级进程init进行解析的. init.rc 文件并不是普通的配置文件,而是由一种被称为"Android初始化语言"(An ...

  3. MTK(android init.rc) 写一个开机启动的服务

    在开机往往我们想要做一些初始化的操作,这时候可以使用init.rc文件来实现,当然书写一个开机启动的服务也需要规范的. 假设是C程序,则需要准备C程序的源码,在我的例程中是一个在开机完成(androi ...

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

    一:init.rc文件修改 开机后运行一次: chmod 777 /system/bin/bt_config.sh service bt_config /system/bin/bt_config.sh ...

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

    init.rc中文件里会通过import /init.${ro.hardware}.rc文件,这个ro.hardware应该是某个详细的属性.而这个ro.hardware赋值应该是在Init进程中赋值 ...

  6. Android 的 init.rc 文件简介【转】

    转自:http://blog.csdn.net/yimiyangguang1314/article/details/6268177 init.rc由许多的Action和Service组成.每一个语句占 ...

  7. android中service启动后台程序

    Service是Android中一个类,它是Android四大组件之一,使用Service可以在后台执行长时间的操作( perform long-running operations in the b ...

  8. Qt自动生成.rc文件并配置对应属性 程序图标 版本 描述等

    Qt项目配置文件pro里需要如下配置,进行qmake,build后会自动生成.rc文件,并将对应的信息写入文件中 VERSION = 1.0.0.1 RC_ICONS = "http.ico ...

  9. JAVA程序通过JNI调用C/C++库

    java程序如何调用c/c++库中的函数主要分为三个步骤: 1. 加载库文件. System.loadLibrary 2. 找到函数( java函数<----映射---->c函数 ) 3. ...

随机推荐

  1. sql server存储过程修改,存储到mysql笔记

    由于有些项目要迁移到mysql上,数据迁移用MySQLWorkbench就能很好的迁移,最难的是存储过程之类的. 下面是sql server存储过程和mysql存储过程的转化: SQL SERVER: ...

  2. 微信开发 access_token 数量限制问题

    微信对access_token的请求有数量限制, 如果用户量特别多的话, access_token  可能会不够用 两种方案: 1.  access_token 加入缓存并设置2小时的失效时间,每次从 ...

  3. PWA天气应用

    https://codelabs.developers.google.com/codelabs/your-first-pwapp/#0 1.介绍 这里将使用PWA技术来构建一个天气web应用,这个ap ...

  4. js php 互调

    1 JS方式调用PHP文件并取得php中的值 举一个简单的例子来说明: 如在页面a.html中用下面这句调用: <! DOCTYPE HTML><html><head&g ...

  5. mysql数据库修改字段类型

    修改字段类型: alter table 表名 modify column 字段名字 decimal(18, 4) ;

  6. HDU-5423 Rikka with Tree。树深搜

    Rikka with Tree 题意:给出树的定义,给出树相似的定义和不同的定义,然后给出一棵树,求是否存在一颗树即和其相似又与其不同.存在输出NO,不存在输出YES. 思路:以1号节点为根节点,我们 ...

  7. 九度oj 题目1207:质因数的个数

    题目描述: 求正整数N(N>1)的质因数的个数. 相同的质因数需要重复计算.如120=2*2*2*3*5,共有5个质因数. 输入: 可能有多组测试数据,每组测试数据的输入是一个正整数N,(1&l ...

  8. 【Luogu】2114起床困难综合征(位运算贪心)

    题目链接 这题真是恶心死我了. 由于位运算每一位互不干涉,所以贪心由大到小选择每一位最优的解,但是要判断一下边界,如果选择该解使得原数>m则不能选择. 代码如下 #include<cstd ...

  9. Ionic 如何把左上角的按钮去掉?

    代码实现: <ion-header > <ion-toolbar> <ion-buttons start> <a href="#"> ...

  10. Nk 1430 Fibonacci(二分矩阵乘幂)

    AC代码: #include<iostream> using namespace std; ][]; ][]; ][]; ][]; void binary(int n) { int i,j ...