JNI学习之C++调用Java层的代码
[TOC]
概述
JNI学习之访问数据基础学习
[TOC]
文章参考:https://blog.csdn.net/tkwxty/article/details/103665532
概述JNI 中的数组分为基本类型数组和对象数组,它们的处理方式是不一样的,基本类型数组中的所有元素都是 JNI的基本数据类型,可以直接访问。而对象数组中的所有元素是一个类的实例或其它数组的引用,和字符串操作一样,不能直接访问 Java 传递给 JNI 层的数组,必须选择合适的 JNI 函数来访问和设置 Java 层的数组对象。阅读此文假设你已经了解了 JNI 与 Java 数据类型的映射关系。
下面让我们从JNI的基本数组操作函数开始,一步步带领读者攻破JNI对数组的处理。
JNI数组处理函数好了有了前面知识的铺垫,下面让我们来看看JNIEnv为我们提供了那些常见的数组处理函数。
1.1 GetArrayLength1.4 New<PrimitiveType>Array函数集这里的PrimitiveType指代的是一系列的JNI基本数据类型。
函数原型:
1NativeTypeArray New<PrimitiveType>Arr ...
JNI学习之JNI环境的基础
[TOC]
文章参考:https://weread.qq.com/web/reader/a80325c0715a39b7a806749
概述结构体JNIEnvJNIEnv是代表JNI环境的结构体,定义如下:
12345678910struct _JNIEnv;struct _JavaVM;typedef const struct JNINativeInterface* C_JNIEnv;#if defined(__cplusplus)typedef _JNIEnv JNIEnv;typedef _JavaVM JavaVM;#elsetypedef const struct JNINativeInterface* JNIEnv;typedef const struct JNIInvokeInterface* JavaVM;#endif
从代码看,JNI的定义还区分了C和C++。因为Android中已经定义了宏__cplusplus,所以这里可以只关注C++部分的代码。在C++部分,JNIEnv等同于结构_JNIEnv,下面是_JNIEnv的定义:
12345678910struct ...
Android之C++多线程学习
[TOC]
概述Android C++中的线程同步主要就是对pthread的mutex和condition的封装。
MutexAndroid Mutex的实现源码位于/system/core/libutils/include/utils/Mutex.h,我们先来看一下Mutex类的具体实现:
123456789101112131415161718192021222324252627282930class Mutex {public: enum { PRIVATE = 0, SHARED = 1 }; Mutex(); Mutex(const char* name); Mutex(int type, const char* name = NULL); ~Mutex(); // lock or unlock the mutex status_t lock(); void unlock(); // lock if p ...
View事件分发机制基础学习
[TOC]
文章参考:https://wangkuiwu.github.io/2015/01/04/TouchEvent-ViewGroup/
文章参考:https://blog.csdn.net/geduo_83/article/details/86560896
文章参考:http://www.azzwen.com/2016/02/17/Android-%E4%BA%8B%E4%BB%B6%E4%BC%A0%E9%80%92%E5%88%86%E6%9E%90/
文章参考:https://wangkuiwu.github.io/2015/01/04/TouchEvent-ViewGroup/
下面,我们来介绍View的一个核心知识点:事件分发机制。我们知道View的事件分发机制是非常重要的。事件分发机制不仅仅是核心知识点更是难点,当然也是面试过程中必不可少的面试环节。另外,View的另一大难题滑动冲突,它的解决方法的理论基础就是事件分发机制,因此掌握好View的事件分发机制是十分重要的。本节将深入介绍View的事件分发机制。
点击事件的传递当我们的手指触摸到屏幕上的View的时候,事 ...
View事件分发机制问题学习
[TOC]
文章参考:https://mp.weixin.qq.com/s/YyJu3b_-InWjgyVXz48B4g
概述我们将整个Touch事件可以分解为以下几个部分:
Touch事件如何从屏幕到我们的App
Touch事件到达App后怎么传递到对应页面
Touch事件到达对应页面后内部怎样分发
其中与上层软件开发息息相关的就是第3条,也是我们最关注的,它也可以拆解为以下几个问题
ViewGroup是否拦截事件,拦截与不拦截后分别怎么处理?
子View是否拦截事件,拦截与不拦截后分别怎么处理?
ViewGroup与子View都不拦截,最终事件如何处理?
如何处理事件冲突?
从屏幕到APP硬件与内核部分当我们触摸屏幕或者按键操作时,首先触发的是硬件驱动
驱动收到事件后,将相应事件写入到输入设备节点,这便产生了最原生态的内核事件当屏幕被触摸,Linux内核会将硬件产生的触摸事件包装为Event存到/dev/input/event[x]目录下
这样做的目的是将输入事件封装为通用的Event,供后续处理
SystemServer部分我们 ...
Android之性能监控框架
[TOC]
解决Could not find method ndkVersion() for arguments on object of type com.android.build.问题解决方案:https://blog.csdn.net/u012558210/article/details/106427634
刚升级完Android Studio 4.0,偶然用到了 NDK 相关的项目,运行后出这个错,还以为我这台电脑没有装相应的 NDK 点击Update。
解决问题通过提示Open File 发现文件的 android 标签的最下面AS给自动加了这么一行:
1ndkVersion '21.2.6472646'
这行就是问题所在了,但去掉后还会出现最开始的NSK not configured的错误,套娃出现。这是因为项目中没有配置NDK的路径,编译时找不到了,所以打开local.properties文件,发现果然没有ndk的配置,加上本机的NDK路径:
再次编译,SUCCESSFUL!
Android之SELinux安全机制基础
[TOC]
概述Android应用程序是运行在一个沙箱中。这个沙箱是基于Linux内核提供的用户ID(UID)和用户组ID(GID)来实现的。Android应用程序在安装的过程中,安装服务PackageManagerService会为它们分配一个唯一的UID和GID,以及根据应用程序所申请的权限,赋予其它的GID。
有了这些UID和GID之后,应用程序就只能限访问特定的文件,一般就是只能访问自己创建的文件。此外,Android应用程序在调用敏感的API时,系统检查它在安装的时候会没有申请相应的权限。如果没有申请的话,那么访问也会被拒绝。对于有root权限的应用程序,则不受上述沙箱限制。此外,有root权限的应用程序,还可以通过Linux的ptrace注入到其它应用程序进程,以及系统进程,进行各种函数调用拦截。
本系列主要讲代码加壳、注入和拦截技术的,包括:
0SELinux开发入门指南之SELinux基础知识
[TOC]
概述
Kotlin之基础语法
[TOC]
基本语法定义包包的声明应处于源文件顶部:
12345package my.demoimport java.util.*// ……
目录与包的结构无需匹配:源代码可以在文件系统的任意位置。
参见包。
定义函数带有两个 Int 参数、返回 Int 的函数:
1234567891011//sampleStart// 参数类型的声明,放在参数变量的后面,返回值也放在函数的后面fun sum(a: Int, b: Int): Int { return a + b}//sampleEndfun main() { print("sum of 3 and 5 is ") println(sum(3, 5))}
将表达式作为函数体、返回值类型自动推断的函数:
1234567//sampleStartfun sum(a: Int, b: Int) = a + b//sampleEndfun main() { println("sum of 19 and 23 is $ ...