栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

mmap实现进程内写数据和读数据

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

mmap实现进程内写数据和读数据

使用mmap函数可以实现内存映射,腾讯的mmkv就是基于mmap函数实现的匿名共享内存实现的,android中的binder也用到了mmap函数。本文在同一个进程内(进程和子进程间)实现了一个mmap共享内容的demo。
首先声明一个mmap java工具类BinderHelper.java

//BinderHelper.java
package com.example.mmapapp;

public class BinderHelper {
    // Used to load the 'native-lib' library on application startup.
    static {
        System.loadLibrary("native-lib");
    }

    public native String mmapReadFromJNI();
    public native void mmapWriteToJNI();
}

具体jni代码实现在native-lib.cpp

//native-lib.cpp
#include 
#include 
#include 
#include 
#include 
#include 
#include 


extern "C"
JNIEXPORT jstring JNICALL
Java_com_example_mmapapp_BinderHelper_mmapReadFromJNI(JNIEnv *env, jobject thiz) {
    std::string file = "/sdcard/mybinder";
    int mFd = open(file.c_str(),O_RDWR|O_CREAT,S_IRWXU);
    ftruncate(mFd,4096);//设定文件大小
    int8_t *m_prt = static_cast(mmap(0, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, mFd,0));
    char *buf = static_cast(malloc(100));
    memcpy(buf,m_prt,100);
    std::string result(buf);
    munmap(m_prt,4096);//取消映射
    close(mFd);
    return env->NewStringUTF(result.c_str());
}

extern "C"
JNIEXPORT void JNICALL
Java_com_example_mmapapp_BinderHelper_mmapWriteToJNI(JNIEnv *env, jobject thiz) {
    std::string file = "/sdcard/mybinder";
    int mFd = open(file.c_str(),O_RDWR|O_CREAT,S_IRWXU);
    ftruncate(mFd,4096);//设定文件大小
    int8_t *m_prt = static_cast(mmap(0, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, mFd,0));
    std::string data("data from MainActivity");
    memcpy(m_prt,data.data(),data.size());
}

主进程在MainActivity.java中使用mmap向内存中写数据,然后跳转到子进程SecondActivity.java

//MainActivity.java
package com.example.mmapapp;

import androidx.appcompat.app.AppCompatActivity;

import android.Manifest;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity {

    BinderHelper mBinderHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mBinderHelper = new BinderHelper();
        initPermission();
    }

    private void initPermission() {
        requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE},200);
    }


    public void write(View view) {
        mBinderHelper.mmapWriteToJNI();
        startActivity(new Intent(MainActivity.this,SecondActivity.class));
    }
}

子进程SecondActivity.java使用相同的路径和mmap函数去读数据并正确显示到界面上

//SecondActivity.java
package com.example.mmapapp;

import androidx.appcompat.app.AppCompatActivity;

import android.Manifest;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class SecondActivity extends AppCompatActivity {
    private BinderHelper mBinderHelper;
    private TextView mTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        mTextView = findViewById(R.id.txt);
        mBinderHelper = new BinderHelper();
        initPermission();
    }

    private void initPermission() {
        requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE},200);
    }

    public void read(View view) {
        mTextView.setText(mBinderHelper.mmapReadFromJNI());
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/702274.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号