init.rc檔案中面啟動c++程式,通過jni調用java實現

來源:互聯網
上載者:User

標籤:mini   and   實際應用   har   gen   alt   define   close   result   

</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:= 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


 

init.rc檔案中面啟動c++程式,通過jni調用java實現

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.