当前位置: 首页 > news >正文

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

http://www.xdnf.cn/news/483769.html

相关文章:

  • 高效管理嵌套Git仓库:三合一脚本解决方案
  • 【AI】CUDA 是如何成功的?(AI 计算的民主化,第 3 部分)
  • MOS管、三极管与IGBT管的原理与应用全面对比
  • 如何解决Move to iOS 不起作用的问题?
  • Yocto Project 快速构建
  • 将单链表反转【数据结构练习题】
  • 机器学习入门之KNN算法和交叉验证与超参数搜索(三)
  • 如何在一台环境中同时安装ragflow和ragflow-plus
  • PCL 绘制二次曲面
  • Golang基于反射的ioctl实现
  • 鸿蒙5.0项目开发——鸿蒙天气项目的实现(主页2)
  • HarmonyOS 开发之 —— 合理使用动画与转场
  • userfaultfd内核线程D状态问题排查
  • 数学实验(Matlab编程基础)
  • Flutter - 集成三方库:日志(logger)
  • 【深度学习】#11 优化算法
  • 麒麟服务器操作系统安装 MySQL 8 实战指南
  • EC800X_DP-DTU-Q600R 系列开发板介绍
  • QML 动画控制、顺序动画与并行动画
  • 25考研经验贴(11408)
  • 智能呼叫系统中的NLP意图理解:核心技术解析与实战
  • 游戏引擎学习第286天:开始解耦实体行为
  • R1 快开门式压力容器操作证备考练习题及答案
  • 2025程序设计天梯赛补题报告
  • 《数字藏品APP开发:解锁高效用户身份认证与KYC流程》
  • xss-labs靶场第11-14关基础详解
  • 2025认证杯数学建模第二阶段A题完整论文(代码齐全):小行星轨迹预测思路
  • MySQL的 JOIN 优化终极指南
  • RAG-MCP:突破大模型工具调用瓶颈,告别Prompt膨胀
  • Android Studio AI插件与Bolt工具实战指南:从零到一打造智能应用