init.rc文件里面启动c++程序,通过jni调用java实现
来源:互联网 发布:岛崎遥香握手数据切 编辑:程序博客网 时间:2024/05/17 02:22
</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); }}
LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE:= testmainLOCAL_SRC_FILES:= \ testmain.cppLOCAL_C_INCLUDES :=LOCAL_MODULE_TAGS := optional engLOCAL_SHARED_LIBRARIES += libcutils \ libutils \ liblog \ libandroid_runtime \ libnativehelper \ libdl \include $(BUILD_EXECUTABLE)
init.rc修改:
class 值为main时才能开机自动启动
service testmain /system/bin/testmainclass mainuser rootoneshot
end
0 0
- init.rc文件里面启动c++程序,通过jni调用java实现
- java通过jni调用C程序
- JNI小程序:Java通过JNI调用C程序
- init进程 && 解析启动脚本init.rc && init.rc中启动sh文件 && JAVA中跑shell
- linux 启动流程详解之/init/main.c:init调用/etc/rc.d/rc.sysinit
- jni实现C语言调用Java程序
- android启动文件init.rc
- Android开发 通过JNI实现JAVA与C/C++程序间的调用和回调
- JAVA中通过JNI调用C程序实例教程
- Java通过JNI调用本地C/C++程序
- Java通过JNI调用本地C/C++程序--常用示例
- Chap5:使用JNI技术实现java程序调用第三方dll(c/c++)文件的功能
- 使用JNI技术实现java程序调用第三方dll(c/c++)文件的功能
- android studio 调用jni,实现Java调用C语言程序
- java JNI调用c程序
- 【Java】Java调用C/C++程序的实现(jni)
- Java通过JNI调用C++程序
- Java通过JNI调用C++程序
- 第12周项目3求“1*3*5*...*n”的递归式(递归函数)
- 1113
- Unity3D中脚本的执行顺序和编译顺序
- Normalize.css – 现代 Web 开发必备的 CSS resets
- 第十二周项目一阅读程序(2)②
- init.rc文件里面启动c++程序,通过jni调用java实现
- 字节序与位序
- windows和linux双系统修改启动项顺序
- Video Google: A Text Retrieval Approach----词频那部分解释
- 第十二周项目1观察静态变量的存储特征
- 解决MySQL远程连接不上的问题
- 本地lan网络中,目标硬件地址与源硬件地址都是两个PC自身的
- mysql备份还原-mysqldump实例
- maven环境快速搭建