????????前兩篇我們講了中間件的開發和打包應用,
????????Android framework 中間件開發(一)
????????Android framework 中間件開發(二)
????????這邊我們來講一下在中間件中編寫JNI
? ? ? ? 1.新建C++文件
? ? ? ? 找到frameworks\base\services\core\jni\路徑,新建一個cpp文件,文件名為com_android_server_DarkControlService.cpp,里面就寫兩個測試函數,內容如下:
#define LOG_TAG "--==>>"
#include <utils/Log.h>
#include <log/log.h>
#include <jni.h>
#include <android_runtime/AndroidRuntime.h>
#include <nativehelper/JNIHelp.h>
#include "core_jni_helpers.h"namespace android{static jint android_server_DarkControlService_getSum(JNIEnv *env, jobject thiz, jint num1, jint num2)
{ALOGE("num1: %d, num2: %d",num1,num2);return num1+num2;
}static void android_server_DarkControlService_testPrint(JNIEnv *env, jobject thiz,jstring str)
{const char* cstr = env->GetStringUTFChars(str, NULL);ALOGE("testPrint: %s",cstr);// 記得釋放內存env->ReleaseStringUTFChars(str, cstr);
}static const JNINativeMethod method_table[] = {{ "native_getSum", "(II)I",(void *)android_server_DarkControlService_getSum },{ "native_testPrint", "(Ljava/lang/String;)V",(void *) android_server_DarkControlService_testPrint },
};int register_android_server_DarkControlService(JNIEnv *env)
{return jniRegisterNativeMethods(env, "com/android/server/DarkControlService",method_table, NELEM(method_table));
}} // namespace android
????????里面有幾個重要的地方,static const JNINativeMethod method_table[]和register_android_server_DarkControlService
????????method_table中需要將暴露給java的函數都在里面聲明一下,注意每個函數的傳參和返回值,
????????register_android_server_DarkControlService:這個是將這個C++代碼和中間件的service類綁定起來
????????2.引入源文件
? ? ? ? 找到frameworks\base\services\core\jni\Android.bp,將剛剛寫的cpp文件添加到這邊:
? ? ? ? 3.初始化綁定?
? ? ? ? 找到frameworks\base\services\core\jni\onload.cpp文件,將剛剛的register_android_server_DarkControlService函數添加進去,
? ? ? ? 4.調用jni?
? ? ? ? 在DarkControlService中添加jni中的兩個函數
然后我們調用一下這兩個函數,
這樣就算完成了,重新編譯之后開機我們看一下執行的log