Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >手写 Parcelable 序列化和反序列化的具体过程

手写 Parcelable 序列化和反序列化的具体过程

作者头像
曾大稳
发布于 2018-09-11 02:55:13
发布于 2018-09-11 02:55:13
90500
代码可运行
举报
文章被收录于专栏:曾大稳的博客曾大稳的博客
运行总次数:0
代码可运行
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
binder 和 socket 通信的区别有哪些 :
    binder 共享内存,Soket需要copy内存
    Socket 远程,本地低速(zygote)


Serializable 和 Parcelable 之间的区别: (io流,共享内存)

Parcelable 序列化和反序列化的具体过程

Parcel.kt

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package zzw.com.testparcel

public class Parcel {

    companion object {
        // Used to load the 'native-lib' library on application startup.
        init {
            System.loadLibrary("native-lib")
        }
    }

    private var mNativePtr: Long = 0

    init {
        mNativePtr = nativeCreate()
    }


    fun writeInt(value: Int) {
        nativeWriteInt(mNativePtr, value)
    }

    fun readInt(): Int {
        return nativeReadInt(mNativePtr)
    }

    fun setDataPosition(pos: Int) {
        nativeSetDataPosition(mNativePtr, pos)
    }

    private external fun nativeCreate(): Long
    private external fun nativeSetDataPosition(nativePtr: Long, pos: Int)

    private external fun nativeWriteInt(nativePtr: Long, value: Int)
    private external fun nativeReadInt(nativePtr: Long): Int


}

native-lib.cpp

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <jni.h>
#include <stdlib.h>
#include <string>


class Parcel {
    char *mData;//共享内存首地址
    int mDataPos = 0;//当前指针位置
public:
    Parcel() {
        mData = (char *) malloc(1024);
    }

    void writeInt(jint value) {
        *reinterpret_cast<int *>(mData + mDataPos) = value;
        mDataPos += sizeof(int);
    }

    void setDataPosition(jint i) {
        mDataPos = i;
    }

    jint readInt() {
        int result = *reinterpret_cast<int *>(mData + mDataPos);
        mDataPos += sizeof(int);
        return result;
    }
};


extern "C" JNIEXPORT jlong
JNICALL
Java_zzw_com_testparcel_Parcel_nativeCreate(
        JNIEnv *env,
        jobject /* this */) {

    return reinterpret_cast<jlong>(new Parcel());
}




extern "C" JNIEXPORT void
JNICALL
Java_zzw_com_testparcel_Parcel_nativeWriteInt(
        JNIEnv *env,
        jobject, jlong ptr, jint value) {
    Parcel *parcel = reinterpret_cast<Parcel *>(ptr);
    parcel->writeInt(value);
}

extern "C" JNIEXPORT void
JNICALL
Java_zzw_com_testparcel_Parcel_nativeSetDataPosition(
        JNIEnv *env,
        jobject, jlong ptr, jint pos) {
    Parcel *parcel = reinterpret_cast<Parcel *>(ptr);
    parcel->setDataPosition(pos);

}

extern "C" JNIEXPORT jint
JNICALL
Java_zzw_com_testparcel_Parcel_nativeReadInt(
        JNIEnv *env,
        jobject, jlong ptr) {
    Parcel *parcel = reinterpret_cast<Parcel *>(ptr);
    return parcel->readInt();
}

MainActivity.kt

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package zzw.com.testparcel

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        var parcel = Parcel()

        parcel.writeInt(5)
        parcel.writeInt(10)

        parcel.setDataPosition(0)

        var num1 = parcel.readInt()
        var num2 = parcel.readInt()

        Log.e("zzz", "num1 =$num1  num2=$num2   ")
    }

}

writeString分为两节,会先把长度存着,然后后面跟着具体的数据

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-03-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android开发之漫漫长途 Ⅷ——Android Binder(也许是最容易理解的)
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列。该系列引用了《Android开发艺术探索》以及《深入理解Android 卷Ⅰ,Ⅱ,Ⅲ》中的相关知识,另外也借鉴了其他的优质博客,在此向各位大神表示感谢,膜拜!!!另外,本系列文章知识可能需要有一定Android开发基础和项目经验的同学才能更好理解,也就是说该系列文章面向的是Android中高级开发工程师。
LoveWFan
2018/08/07
6850
Android开发之漫漫长途 Ⅷ——Android Binder(也许是最容易理解的)
Android 反序列化漏洞攻防史话
Java 在历史上出现过许多反序列化的漏洞,但大部分出自 J2EE 的组件。即便是 FastJSON 这种漏洞,似乎也很少看到在 Android 中被实际的触发和利用。本文即为对历史上曾出现过的 Android Java 反序列化漏洞的分析和研究记录。
evilpan
2023/03/27
1.9K0
Android 反序列化漏洞攻防史话
Parcel源码上手
Parcel作为Android Binder通信的基础,从源码的角度,了解下parcel的特性,还是很有必要的。
韦东锏
2021/09/29
7480
听说你Binder机制学的不错,来面试下这几个问题(三)
很多文章将Binder框架定义了四个角色:Server,Client,ServiceManager、以及Binder驱动,但这容易将人引导到歧途:好像所有的Binder服务都需要去ServiceManager去注册才能使用,其实不是这样。例如,平时APP开发通过bindService启动的服务,以及有些自己定义的AIDL远程调用,都不一定都ServiceManager注册这条路,个人理解:ServiceManager主要功能是:管理系统服务,比如AMS、WMS、PKMS服务等,而APP通过的bindService启动的Binder服务其实是由SystemServer的ActivityManagerService负责管理。这篇主要关注Android APP Java层Binder通信一些奇葩点:
看书的小蜗牛
2018/06/29
2K0
听说你Binder机制学的不错,来面试下这几个问题(三)
binder是如何在java层和native层实现统一的
众所周知,对于binder通信来说,native层通信的基础架构是BpBinder/BBinder,Java层的基础通信架构是BinderProxy/Binder,这两者是如何统一起来的呢?
好好学习吧
2023/06/03
5410
Android跨进程通信IPC之4——AndroidIPC基础1
这里强烈建议把前面两篇文章看一遍,因为前面两篇文章对后面大家对android的IPC的理解帮助很大,本片文章主要内容如下
隔壁老李头
2018/08/30
1.3K0
Android跨进程通信IPC之4——AndroidIPC基础1
Binder进程间通信详解
前言 隔行如隔山,这句话同样适用于任何时候,即时同一个专业,深入下去的话,差别也是巨大的。今天,讲下自己如何学习binder进程间通信的机制的一些见解。开始的时候,只知道 Binder 是个很底层的东西,甚至对于具体是什么用都不是很清楚。 主要是通过两种方式: 看别人写的Binder博文 目的很简单,大概了解Binder是个什么东西,有哪些核心的东西,对于看源码的时候选择性过滤有帮助,最好是看了后画下思维导图总结下或者可以画下流程图。 看Binder源码 对于切入点的话,从最熟悉的客户端入手;选择
用户1148881
2018/05/28
1.3K0
Parcelable与Serializable
由于 Java 的 Serializable 的性能较低,Parcelable 正式在这个背景下产生的,它核心作用就是为了解决 Android 中大量跨进程通信的性能问题。
老马的编程之旅
2022/06/22
1.2K0
NanoMsg框架|Android的各模式通讯封装(不另编译动态库附DEMO地址)
上一篇《NanoMsg框架|Android中简单封装PAIR的使用(附Demo地址)》已经把NanoMsg的PAIR使用完成了,但是也是一个半成品,后面要完善的多较多,本章我又重新写了一个Android的Demo,一个是自己用的,并且做了一些小的测试,解决了一次测试中的问题后的版本,还未在生产环境下使用,不过也准备开始测试移植了。
Vaccae
2020/03/12
1.1K0
Kivy A to Z — 怎样从python代码中直接訪问Android的Service「建议收藏」
在Kivy中,通过pyjnius扩展能够间接调用Java代码,而pyjnius利用的是Java的反射机制。可是在Python对象和Java对象中转来转去总让人感觉到十分别扭。好在android提供了binder这个进程间通信的功能,Java中的Service也是基于Binder的C++代码封装来实现进程间通信的,这也为从Python代码中绕开pyjnius直接訪问Java代码提供了可能,既然Java的Service是基于C++的封装来实现的,也相同能够在Python中封装相同的C++代码,这篇文章解说了怎样通过binder在Python代码中直接訪问Java的Service。如WifiService。
全栈程序员站长
2022/07/10
6590
你应该了解的JNI知识(二)——Java与JNI互相调用
在你应该了解的JNI知识(一)——静态注册与动态注册中,了解了JNI是如何使用的,以及两种注册方式的使用以及区别。本篇博客将介绍Java和JNI的互相调用,因此主要包括两部分:
用户1108631
2019/08/17
1.8K0
NDK开发案例 | C/C++调用java层代码
随笔分类 - jni NDK开发(三)——C/C++代码如何调用java层代码 E:\AndroidProject\TheTestPro\NDKDemo\app\build\intermediates\javac\debug\classes>javap -s -p com.lwp.ndkdemo.MainActivity Compiled from "MainActivity.java" public class com.lwp.ndkdemo.MainActivity extends androidx.a
凌川江雪
2020/07/22
5540
jni小细节操作
数组的细节处理 #include <jni.h> #include <string> #include <stdlib.h> int compare(const jint *a, const jint *b) { return *a - *b; } extern "C" JNIEXPORT void JNICALL Java_com_zzw_jnidemo_ArrayUtils_sort(JNIEnv *env, jclass type, jintArray array_) { ji
曾大稳
2018/09/11
1.1K0
JNI操作接口实践(三)
        前面我们介绍了JNI的常规注册方法(静态注册方法),并对JNI各种典型应用做了一个实践演练。本文我们介绍JNI的另一个注册方法:动态注册方法
用户4148957
2022/06/14
3240
Android跨进程通信IPC之4——AndroidIPC基础2
通过 Parcel的writeStrongBinder方法将Binder对象序列化:
隔壁老李头
2018/08/30
1.3K0
Android跨进程通信IPC之4——AndroidIPC基础2
Android内存篇(一)---使用JVMTI监控应用
一般产品或项目前期都是以快速实现,上线的方式来完成,在生产环境中再开始进行优化,而Android的APP优化,比较重点的还是内存优化,因为每个APP都分配的最大内存,像内存泄露,内存抖动等慢慢都会让APP出来OOM崩溃的情况,最近也是一直在学习和研究内存优化这块,也是在实践中记录笔记。
Vaccae
2022/05/25
2.6K0
Android内存篇(一)---使用JVMTI监控应用
Android窗口管理分析(2):WindowManagerService窗口管理之Window添加流程
之前分析说过,WindowManagerService只负责窗口管理,并不负责View的绘制跟图层混合,本文就来分析WMS到底是怎么管理窗口的。初接触Android时感觉:Activity似乎就是Google封装好的窗口,APP只要合理的启动新的Activity就打开了新窗口,这样理解没什么不对,Activity确实可以看做一种窗口及View的封装,不过从源码来看,Activity跟Window还是存在不同。本文主要从窗口的添加流程来将APP端、WMS端、SurfaceFlinger端三块串联起来,主要说一
看书的小蜗牛
2018/06/29
3.1K0
Android窗口管理分析(4):Android View绘制内存的分配、传递、使用
前文Android匿名共享内存(Ashmem)原理分析了匿名共享内存,它最主要的作用就是View视图绘制,Android视图是按照一帧一帧显示到屏幕的,而每一帧都会占用一定的存储空间,通过Ashmem机制APP与SurfaceFlinger共享绘图数据,提高图形处理性能,本文就看Android是怎么利用Ashmem分配及绘制的:
看书的小蜗牛
2018/06/29
2.4K0
图片系列(6)不同版本上 Bitmap 内存分配与回收原理对比
Bitmap 是 Android 应用的内存占用大户,是最容易造成 OOM 的场景。为此,Google 也在不断尝试优化 Bitmap 的内存分配和回收策略,涉及:Java 堆、Native 堆、硬件等多种分配方案,未来会不会有新的方案呢?
用户9995743
2022/09/26
1.6K0
图片系列(6)不同版本上 Bitmap 内存分配与回收原理对比
JNI 从入门到实践,万字爆肝详解!
JNI(Java Native Interface,Java 本地接口)是 Java 生态的特性,它扩展了 Java 虚拟机的能力,使得 Java 代码可以与 C/C++ 代码进行交互。 通过 JNI 接口,Java 代码可以调用 C/C++ 代码,C/C++ 代码也可以调用 Java 代码。
用户9995743
2022/09/26
2.6K0
JNI 从入门到实践,万字爆肝详解!
推荐阅读
相关推荐
Android开发之漫漫长途 Ⅷ——Android Binder(也许是最容易理解的)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验