Android framework 中间件开发(三)
前两篇我们讲了中间件的开发和打包应用,
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