Android 完整SDK项目中添加对应的JNI与底层通信

安卓应用发消息给底层

近日需要写一个安卓app和底层发消息,这就涉及到java如何到c层的一个逻辑,app已经写好,就差发个消息了。至于如何对接底层,得和写底层的人进一步沟通,本文笔者只写从java层通信到cpp,并且打印出一个值,至于通信底层,到了c层了,open,read一个驱动,也就轻轻松松了。

文章目录

framework/jni 编写

\android_sdk\frameworks\base\core\jni

新建一个cpp文件
SendDriverMsg.cpp

这个Cpp主要就是注册实际要执行的代码,比如下文的sendMsg函数

cpp 复制代码
#define LOG_TAG "SendDriverMsg"

#include "jni.h"
#include "android_runtime/AndroidRuntime.h"
#include <nativehelper/JNIHelp.h>
#include "utils/Log.h"

	// 实现 sendMsg 函数,用于调用底层的东西并传递数据
int sendMsg(int msg) {
    // 在这里实现调用底层的逻辑,处理传递的数据 msg
	// 打印信息到 Logcat
        __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "*******************");
		__android_log_print(ANDROID_LOG_INFO, LOG_TAG, "%d", msg);
    return msg; 
}

//注意名称空间和Java调用JNI所有路径紧密的关系,不能随便取名称
namespace android {
	static jint android_sendMsg(JNIEnv *env,jobject clazz,jint msg){
		return sendMsg(msg);
	}
/*
`sendSelect_MSG` 方法需要一个整数参数 `msg`,则方法的签名应该为 `"(I)I"`。
这样,`sendSelect_MSG` 方法会被认为接受一个整数参数并返回一个整数。
*/
static JNINativeMethod method_table[] ={
	{"sendSelect_MSG","(I)I",(void *)android_sendMsg},
};

//JNI注册函数,后面应用层导入包就是android.sendMsg
int register_android_sendMsg(JNIEnv *env){
	//第二个参数是对应的java代码的路径,我这里的java代码名字是SendMsg.java
		//这个参数和应用层java文件调用包的路径有关联
		//frameworks/base/core/java/android/sendMsg/SendMsg.java完整路径是对应的
		//应用层导入包名android.sendMsg,android.sendMsg.SendMsg
	return AndroidRuntime::registerNativeMethods(env,"android/sendMsg/SendMsg",method_table,NELEM(method_table));
}
};

注册编写好的JNI--->AndroidRuntime.cpp

打开同目录下的AndroidRuntime.cpp

进去之后,先看我怎么加,你就会知道怎么写,俩个字"模仿"文件的其它cpp添加即可

cpp 复制代码
extern int register_android_sendMsg(JNIEnv* env);

//..................省略代码

static const RegJNIRec gRegJNI[] = {
//..................省略代码

REG_JNI(register_android_sendMsg),
//..................省略代码

}

主要就是添加两行

  1. extern int register_android_sendMsg(JNIEnv* env);
  2. REG_JNI(register_android_sendMsg),
  3. 在文中找到对应的地方添加就可以了

创建\frameworks\base\core\java\android\sendMsg\SendMsg.java文件并编写

java 复制代码
package android.sendMsg;
/**
	Native methods for managing fm
	{@hide}
*/
public class SendMsg{
	public native int sendSelect_MSG(int msg);//Android应用的代码最终能调用的就是这个代码
	public SendMsg(){
	}
}

在实际应用APP目录下packages/apps/test.java调用对应的代码

导入你写好的framework层的包名

实例化,并且调用

烧录并等待对应的结果

结束

如果对你有帮助,来个三连支持一下吧。

相关推荐
云和数据.ChenGuang8 小时前
Python 常见特殊方法详解:__new__、__init__、__del__、__str__、__repr__ 与 __getattribute__
开发语言·人工智能·python·1024程序员节
xyouyuweizhu8 小时前
字节流与字符流:Java IO 的两条主线该怎么选
java·开发语言·python
迪菲赫尔曼8 小时前
【基础篇 04】第一次使用终端:命令在哪里输入,电脑现在又“站”在哪里?
python·yolo·目标检测
qianbo_insist8 小时前
# 在 Qwen3.5-2B 上把 GDN-1 无损换成 GDN-2:一次完整的架构手术实验(负结果)
人工智能·pytorch·python·架构
多弗朗皮卡丘9 小时前
C++的IO流
开发语言·c++·io流·文件io流
骑着蜗牛撵大象3279 小时前
AI Agent 工程化开发实战(三):用 StateGraph 给智能体搭一条可回放的状态流水线
java·开发语言·jvm·ai·状态管理·langgraph·stategraph
itmigrate9 小时前
Rust 里的所有权误区:不是不写 clone 就叫高性能
开发语言·后端·rust
Brilliantwxx9 小时前
【Linux】 文件访问与路径解析:目录、文件名、dentry、路径缓冲与 dcache 全解析
linux·运维·服务器·开发语言·spring
摇滚侠9 小时前
《On Java 中文版 基础卷》阅读笔记 初始化和清理 08
java·开发语言·笔记
xiangyun6110 小时前
C++ 手撕 shared_ptr:引用计数与控制块到底长什么样?
开发语言·c++·算法·面试·stl