Framework定制-在JAVA核心库中移植Android Log

在java核心库中,由于无法导入android的包,要想使用Log,最粗暴的方式就是用反射调用,还有一种方式就是移植Android的Log到java核心库中。

具体实现如下:

创建JLog.java

aosp/libcore/ojluni/src/main/java/java/langpackage java.lang;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.json.JSONObject;public class JLog {public static final String mTag = "Yooha-log";public static final int INFO = 4;public static final int ERROR = 6;public static native int println_native(int bufID, int priority, String tag, String msg);public static native int getpid();public static void print_info(String tag, String info) {try{JSONObject jsinfo = new JSONObject();jsinfo.put("Type", tag);jsinfo.put("PID", getProcessID());jsinfo.put("Info", info);i(mTag, jsinfo.toString());} catch (Exception e){showException(e);}}public static void print_stack(String type, String clz, String method, String ret, String...param) {try{JSONObject jsinfo = new JSONObject();jsinfo.put("Type", type);jsinfo.put("PID", getProcessID());jsinfo.put("Class", clz);jsinfo.put("Method", method);if (param != null){jsinfo.put("Param", param.toString());}else{jsinfo.put("Param", "NULL");}if (ret == null){jsinfo.put("Return", "NULL");}else{jsinfo.put("Return", ret);}jsinfo.put("stackTrace", getStackTrace());i(mTag, jsinfo.toString());} catch (Exception e){showException(e);}}public static String getStackTrace() {StringBuffer sb = new StringBuffer();try{Throwable ex = new Throwable();StackTraceElement[] stackElements = ex.getStackTrace();for (int i = 0; i < stackElements.length; i++) {StackTraceElement element = stackElements[i];sb.append("at " +element.getClassName() +"." +element.getMethodName() +"(" +element.getFileName() +":" +element.getLineNumber() +")\n");}} catch(Exception e){}return sb.toString();}public static void showException(Exception e){e(mTag, "Type:Exception, ExceptionLine:" + getExceptionLine() + ", Exception:" + e.toString());}public static String getExceptionLine(){StackTraceElement element = new Throwable().getStackTrace()[1];return element.getFileName() + "-->" + element.getLineNumber() + " : " + element.getClassName();}public static int getProcessID(){try{return getpid();} catch (Exception e){}return -1;}public static int i(String tag, String msg){return println_native(0, INFO, tag, msg);}public static int e(String tag, String msg){return println_native(0, ERROR, tag, msg);}
}
  • 将JLog.java文件添加到编译文件链
- 路径:/home/yooha/aosp/libcore/penjdk_java_files.bpfilegroup {name: "openjdk_javadoc_files",srcs: [...省略"ojluni/src/main/java/java/lang/System.java",///ADD START"ojluni/src/main/java/java/lang/JLog.java",///ADD END"ojluni/src/main/java/java/lang/ThreadDeath.java",...省略],
}
  • 在libcore native层添加JLog.c
/aosp/libcore/ojluni/src/main/native#include <log/log.h>
#include <utils/Log.h>
#include <jni.h>
#include <nativehelper/JNIHelp.h>
//#include <process.h>
#include <unistd.h>static jint java_lang_JLog_println_native(JNIEnv* env, jclass clazz,jint bufID, jint priority, jstring tagObj, jstring msgObj)
{const char* tag = NULL;const char* msg = NULL;if (msgObj == NULL) {//JNU_ThrowNullPointerException(env, "println needs a message");return -1;}if (bufID < 0 || bufID >= LOG_ID_MAX) {//JNU_ThrowNullPointerException(env, "bad bufID");return -1;}if (tagObj != NULL)tag = (*env)->GetStringUTFChars(env,tagObj, NULL);msg = (*env)->GetStringUTFChars(env,msgObj, NULL);int res = __android_log_buf_write(bufID, (android_LogPriority)priority, tag, msg);if (tag != NULL)(*env)->ReleaseStringUTFChars(env,tagObj, tag);(*env)->ReleaseStringUTFChars(env,msgObj, msg);return res;
}static jint java_lang_JLog_getpid(JNIEnv* env, jclass clazz){return getpid();
}static const JNINativeMethod gMethods[] = {/* name, signature, funcPtr */{ "println_native",  "(IILjava/lang/String;Ljava/lang/String;)I", (void*) java_lang_JLog_println_native },{ "getpid",  "()I", (void*) java_lang_JLog_getpid }
};void register_java_lang_JLog(JNIEnv* env) {jniRegisterNativeMethods(env, "java/lang/JLog", gMethods, NELEM(gMethods));
}
  • OnLoad.cpp中声明和调用 register_java_lang_JLog
- 路径:libcore/ojluni/src/main/native/OnLoad.cpp...省略
///ADD START
extern "C" void register_java_lang_JLog(JNIEnv* env);
///ADD END
...省略
extern "C" JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void*) {...省略///ADD STARTregister_java_lang_JLog(env);///ADD END...省略
}
...省略
  • Android.bp中添加XLog.c文件到编译文件中
- 路径:/home/yooha/aosp/libcore/ojluni/src/main/native/Android.bpfilegroup {name: "libopenjdk_native_srcs",srcs: [...省略///ADD START"JLog.c",///ADD END...省略],
}

最后编译刷机,就可以正常使用了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/626563.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

openssl3.2 - EVP_MD_fetch算法名称字符串(参数2)的有效值列表

文章目录 openssl3.2 - EVP_MD_fetch算法名称字符串(参数2)的有效值列表概述笔记注释版的摘要算法名称列表END openssl3.2 - EVP_MD_fetch算法名称字符串(参数2)的有效值列表 概述 使用摘要算法时, 官方demo都是使用EVP_MD_fetch(), API参数2要指定算法名称字符串. 如下: in…

MySQL 常用字符串函数 SUBSTRING_INDEX、SUBSTRING、LOCATE 和 LENGTH

在 MySQL 中&#xff0c;SUBSTRING_INDEX、SUBSTRING、LOCATE 和 LENGTH 是字符串处理的一些常用函数。下面是它们的基本用法&#xff1a; SUBSTRING_INDEX SUBSTRING_INDEX(str, delim, count) 用于返回字符串 str 中由分隔符 delim 分隔的子字符串。count 参数指定要返回的…

TDengine 如何进行数据建模

小 T 导读&#xff1a;在使用 TDengine 的时候&#xff0c;通过官网的技术文档可以学习到建库&#xff08;database&#xff09;、建表&#xff08;table&#xff09;的各种 SQL 语句&#xff0c;但是一旦要跟自己的具体业务场景结合&#xff0c;经验不足的朋友可能会不知道到底…

指针及其应用

1.定义 指针&#xff1a;也是一个变量&#xff0c;存放所指变量的地址&#xff0c;根据变量定义的不同&#xff0c;指针指向的类型也不同 注意&#xff1a;*是与前面类型一体的 int main(void) {int* p; //等价于int *p;//为了区分变量&#xff0c;C语言中一般将*放置于变量…

国产开源数据库进入生态发展期

作为基础软件“三驾马车”之一&#xff0c;数据库是支撑信息系统安全稳定运行的重要保障。记者从日前在京举行的openGauss Summit 2023获悉&#xff0c;2023年国产数据库openGauss系新增市场份额达21.9%&#xff0c;标志着openGauss已跨越生态拐点&#xff0c;这对于保障数据安…

.NET 8.0 发布到 IIS

如何在IIS&#xff08;Internet信息服务&#xff09;上发布ASP.NET Core 8&#xff1f; 在本文中&#xff0c;我假设您的 Windows Server IIS 上已经有一个应用程序池。 按照步骤了解在 IIS 环境下发布 ASP.NET Core 8 应用程序的技巧。 您需要设置代码以支持 IIS 并将项目配…

智算让大模型触手可及

本文整理自2023年 12 月 20 日举办的「2023 百度云智大会智算大会」主论坛&#xff0c;百度智能云 AI 与大数据平台总经理忻舟的主题演讲《智算让大模型触手可及》。 在之前极客公园举办的创新大会上&#xff0c;百度集团董事长兼 CEO 李彦宏先生提到&#xff1a;卷 AI 原生应用…

【Linux】各目录说明

【常见目录说明】 目录 /bin 存放二进制可执行文件(ls,cat,mkdir等)&#xff0c;常用命令一般都在这里。 /etc 存放系统管理和配置文件 /home 存放所有用户文件的根目录&#xff0c;是用户主目录的基点&#xff0c;比如用户user的主目录就是/home/user&#xff0c;可以…

智能助手的巅峰对决:ChatGPT对阵文心一言

在人工智能的世界里&#xff0c;ChatGPT与文心一言都是备受瞩目的明星产品。它们凭借先进的技术和强大的性能&#xff0c;吸引了大量用户的关注。但究竟哪一个在智能回复、语言准确性、知识库丰富度等方面更胜一筹呢&#xff1f;下面就让我们一探究竟。 首先来谈谈智能回复能力…

数据结构-排序

这篇文章主要记录各种排序算法的思想及实现代码&#xff0c;最后对各种算法的性能进行了对比。 目录 排序的概念及其运用 排序的概念 排序运用 常见的排序算法 常见排序算法的实现 插入排序 基本思想 直接插入排序 希尔排序 选择排序 基本思想 直接选择排序 堆排序…

C++设计模式-- 2.代理模式 和 外观模式

文章目录 代理模式外观模式角色和职责代码演示一&#xff1a;代码演示二&#xff1a;外观模式适用场景 代理模式 代理模式的定义&#xff1a;为其他对象提供一种代理以控制对这个对象的访问。在某些情况下&#xff0c;一个对象不适合 或不能直接引用另一个对象&#xff0c;而代…

git推送前HOOK pre-push判断版本号增加再推送

我写了一个C程序&#xff0c;然后每次编译后&#xff0c;记不得当时的版本是哪个源代码&#xff0c;对于core dump复现调试很麻烦。 为此我想了一个办法&#xff0c;首先在include/git_version.hpp 创建一个版本的文件 /** Description:* Author: jiangsheng* Date: 2024-01-…

数据结构与算法:快速排序

数据结构与算法&#xff1a;快速排序 快速排序荷兰国旗问题霍尔版本递归优化小区间优化 PartSort优化三数取中 挖坑法前后指针法 非递归法 快速排序 荷兰国旗问题 想要理解快速排序&#xff0c;就先理解这个问题&#xff1a; [LeetCode75.颜色分类] 荷兰国旗是由红白蓝三色组…

10.云原生之在线开发调试

云原生专栏大纲 文章目录 vscode-server介绍VSCode Server 和云开发结合vscode-server安装code-server安装插件在线安装插件离线安装插件安装中文插件 配置开发环境在容器中安装开放环境Dockerfile制作镜像 git拉取项目 vscode-server介绍 VSCode Server&#xff08;Visual S…

动态内存面试的经典题目

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

js includes方法的使用

JavaScript中的数组includes()方法用于判断数组中是否包含指定的元素&#xff0c;并返回一个布尔值。 includes()方法的语法如下&#xff1a; array.includes(searchElement[, fromIndex]) 其中&#xff0c;array是要进行搜索的数组&#xff0c;searchElement是要搜索的元素…

网络安全中的“三高一弱”和“两高一弱”是什么?

大家在一些网络安全检查中&#xff0c;可能经常会遇到“三高一弱”这个说法。那么&#xff0c;三高一弱指的是什么呢&#xff1f; 三高&#xff1a;高危漏洞、高危端口、高风险外连 一弱&#xff1a;弱口令 一共是4个网络安全风险&#xff0c;其中的“高危漏洞、高危端口、弱…

电脑怎么录制屏幕?看这一篇就够了

在数字时代&#xff0c;电脑屏幕录制已经成为人们日常生活中一个越来越重要的工具。无论是录制在线课程、游戏精彩时刻&#xff0c;还是远程会议、软件演示&#xff0c;屏幕录制都可以帮助我们更好地保存和分享这些信息。可是您知道电脑怎么录制屏幕吗&#xff1f;本文将介绍两…

GATHER_DATABASE_STATS 的常见问题及 权限 ANALYZE ANY

​​​​​​光有执行DBMS_STATS的权限还是不够的 DBMS_STATS.GATHER_DATABASE_STATS (ESTIMATE_PERCENT > 30); * ERROR at line 1: ORA-20000: Insufficient privileges to analyze an object in Database ORA-06512: at "SYS.DBMS_STATS", line 13323 ORA-0651…

旧电脑追加内存条

内存条基本知识 DDR4 2666 DDR&#xff08;Double Data Rate&#xff09;双倍速率 4 第四代 2666 内存主频2666MHz 内存时序 内存的延迟时间 传输带宽 MB/s 内存和CPU之间的传输速度 针脚数 数字-PIn 288-PIN就是288个针脚 选购内存条 …