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++)。 后来遇到的问题:实际应用中发现,接收开机广播等待的时间更长,须要提前写入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实现的更多相关文章
- Android init.rc文件浅析
Android init.rc文件浅析 分类: Android2012-04-13 18:00 13149人阅读 评论(2) 收藏 举报 androidservicepathactionsocketc ...
- Android中的 init.rc文件简介
init.rc脚本是由Android中linux的第一个用户级进程init进行解析的. init.rc 文件并不是普通的配置文件,而是由一种被称为"Android初始化语言"(An ...
- MTK(android init.rc) 写一个开机启动的服务
在开机往往我们想要做一些初始化的操作,这时候可以使用init.rc文件来实现,当然书写一个开机启动的服务也需要规范的. 假设是C程序,则需要准备C程序的源码,在我的例程中是一个在开机完成(androi ...
- Android源码分析(十七)----init.rc文件添加脚本代码
一:init.rc文件修改 开机后运行一次: chmod 777 /system/bin/bt_config.sh service bt_config /system/bin/bt_config.sh ...
- android中init.rc文件的解析问题
init.rc中文件里会通过import /init.${ro.hardware}.rc文件,这个ro.hardware应该是某个详细的属性.而这个ro.hardware赋值应该是在Init进程中赋值 ...
- Android 的 init.rc 文件简介【转】
转自:http://blog.csdn.net/yimiyangguang1314/article/details/6268177 init.rc由许多的Action和Service组成.每一个语句占 ...
- android中service启动后台程序
Service是Android中一个类,它是Android四大组件之一,使用Service可以在后台执行长时间的操作( perform long-running operations in the b ...
- Qt自动生成.rc文件并配置对应属性 程序图标 版本 描述等
Qt项目配置文件pro里需要如下配置,进行qmake,build后会自动生成.rc文件,并将对应的信息写入文件中 VERSION = 1.0.0.1 RC_ICONS = "http.ico ...
- JAVA程序通过JNI调用C/C++库
java程序如何调用c/c++库中的函数主要分为三个步骤: 1. 加载库文件. System.loadLibrary 2. 找到函数( java函数<----映射---->c函数 ) 3. ...
随机推荐
- PAT 乙级 1013
题目 题目地址:PAT 乙级 1013 思路 审题没把范围看清楚,没一次AC 题中m和n都表示第几个素数,范围是10000,所以查询的数组中需要的素数量至少10000,所以需要计算大概2~120000 ...
- [JOYOI] 1035 棋盘覆盖
题目限制 时间限制 内存限制 评测方式 题目来源 1000ms 131072KiB 标准比较器 Local 题目描述 给出一张nn(n<=100)的国际象棋棋盘,其中被删除了一些点,问可以使用多 ...
- MySQL的索引知识
一.什么是索引. 索引是用来加速查询的技术的选择之一,在通常情况下,造成查询速度差异 的因素就是索引是否使用得当.当我们没有对数据表的某一字段段或者多个 字段添加索引时,实际上执行的全表扫描操作,效率 ...
- 【Java_基础】Java内部类详解
1.四种内部类 java中的四种内部类:成员内部类.静态内部类.局部内部类和匿名内部类.其中匿名内部类用到的最多. 1.1.成员内部类 若一个类定义在另一个类的内部作为实例成员,我们把这个作为实例成员 ...
- python--进程内容补充
一. 进程的其他方法 进程id, 进程名字, 查看进程是否活着(is_alive()), terminate()发送结束进程的信号 import time import os from multipr ...
- (转)编写高质量的OC代码
点标记语法 属性和幂等方法(多次调用和一次调用返回的结果相同)使用点标记语法访问,其他的情况使用方括号标记语法. 良好的风格: view.backgroundColor = [UIColor or ...
- java各种数据库连接
MySQL: String Driver="com.mysql.jdbc.Driver"; //驱动程序 String URL="jdbc:mys ...
- LeetCode(111) Minimum Depth of Binary Tree
题目 Given a binary tree, find its minimum depth. The minimum depth is the number of nodes along the s ...
- LeetCode(1)Two Sum
题目: Given an array of integers, find two numbers such that they add up to a specific target number. ...
- Lex与Yacc学习(十)之Yacc库
Yacc库 每个实现都需要有用的例程库,在UNIX系统中,可以通过cc命令行尾端给出-ly标志(或通过其他系统下的等价物)来包含库. 库的内容在不同的实现之间是不同的,但总是包括main()和yyer ...