Android framework 中间件开发(三)

前两篇我们讲了中间件的开发和打包应用,

Android framework 中间件开发(一)

Android framework 中间件开发(二)

这边我们来讲一下在中间件中编写JNI

1.新建C++文件

找到frameworks\base\services\core\jni\路径,新建一个cpp文件,文件名为com_android_server_DarkControlService.cpp,里面就写两个测试函数,内容如下:

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

相关推荐
__Witheart__31 分钟前
3568 Android otg模式下adb热拔插不识别
android·adb·rockchip
明天…ling2 小时前
Upload-Labs (Pass1-Pass21) 完整通关思路与源码分析
android·网络安全·渗透测试·burpsuite·upload-labs·文件上传绕过·靶场复现
__Witheart__2 小时前
3568 Android ntp校时使用
android·rockchip
wddptwd283 小时前
android studio 报错怎么处理 java.lang.NullPointerException
android·java·android studio
美狐美颜SDK开放平台4 小时前
直播APP开发,美颜SDK和相机SDK有什么区别?
android·深度学习·数码相机·ios·直播美颜sdk·视频美颜sdk
唐诺5 小时前
Android Open Accessory (AOA) 协议完全解析
android·usb·aoa
我命由我123457 小时前
Android 开发 - 广播组件(标准广播、有序广播、静态注册广播、分钟到达广播、网络变更广播...)
android·java·开发语言·网络·java-ee·android studio·android-studio
A富得流油的咸鸭蛋7 小时前
安卓鸿蒙面试
android·面试·harmonyos
wardenlzr7 小时前
@IntDef 替代 enum:Android 官方推荐的轻量常量方案
android·性能
Coffeeee7 小时前
AGP9.0的主要变更项,给Gradle来一次大变样
android·前端·gradle