美文网首页
NDK开发之路2-手动实现Parcel

NDK开发之路2-手动实现Parcel

作者: HardMan | 来源:发表于2021-08-13 20:11 被阅读0次

即上一篇写完NDK开发之路1-共享内存之后,我们试着手动实现parcel共享内存的方式。

public class Parcel {

    static {
        System.loadLibrary("native-lib");
    }

    public Parcel() {
        this.mNativePrt = nativeCreate();
    }
    //共享内存的首指针
    private long mNativePrt;
  //往内存中写入int数据
    public void writeInt(int value){
        nativeWriteInt(mNativePrt,value);

    }
  //往内存中写入String
    public void writeString(String hello_world) {
            nativeWriteString(mNativePrt,hello_world);
    }

  //写完数据之后 充值内存指针偏移位
    public void setDataPosition(int value){
        nativeSetDataPosition(mNativePrt,value);
    }

    public int readInt(){
        return nativeReadInt(mNativePrt);
    }

    private native int nativeReadInt(long mNativePrt);


    private native void nativeSetDataPosition(long mNativePrt, int value);

    private native void nativeWriteInt(long mNativePrt, int value);

    private native long nativeCreate();

    private native void nativeWriteString(long mNativePrt,String word);

    private native String nativeReadString(long mNativePrt);


    public String readString() {
        return nativeReadString(mNativePrt);
    }
}
#include <jni.h>
#include <string>
#include<android/log.h>
#define  LOG_TAG    "qmz"
#define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)

class Parcel{
    char* point;
    int dataCount;

public:
    Parcel(){
        point= static_cast<char *>(malloc(100));
        dataCount=0;
    };
    //偏移指针 距离为int类型的字节数
    void writeInt(int value){
        *(point+dataCount)=value;
        dataCount+= sizeof(int);
    };

    int readInt(){
        int val= *(point+dataCount);
        dataCount+= sizeof(int);
        return  val;
    };

    void setDataCount(int count){
      dataCount=0;
    }
  //String比较复杂,需要一个个将字符进行赋值
  //同时每次赋值的时候 ,将指针进行偏移
    void writeString(char* str){
        int length=strlen(str);
        int i=0;
        for(;i<length;i++){
            *(point+dataCount)=*(str+i);
            LOGE("native 读取的str内容:%c",*(str+i));
            dataCount++;
        }
//字符串在内存中以\0 结尾,所以别忘了最后补充进去,否则读取字符串的时候会出错
        *(point+dataCount)='\0';

    }

    char* readString(){
        return point+dataCount;
    }
};


extern "C"
JNIEXPORT jint JNICALL
Java_com_qiumz_ndk_102_Parcel_nativeReadInt(JNIEnv *env, jobject thiz, jlong m_native_prt) {

        Parcel* parcel= reinterpret_cast<Parcel *>(m_native_prt);
        return  parcel->readInt();

}extern "C"
JNIEXPORT void JNICALL
Java_com_qiumz_ndk_102_Parcel_nativeSetDataPosition(JNIEnv *env, jobject thiz, jlong m_native_prt,
                                                    jint value) {
    Parcel* parcel= reinterpret_cast<Parcel *>(m_native_prt);
    parcel->setDataCount(value);


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


extern "C"
JNIEXPORT jlong JNICALL
Java_com_qiumz_ndk_102_Parcel_nativeCreate(JNIEnv *env, jobject thiz) {
    Parcel* parcel=new Parcel();
    return reinterpret_cast<jlong>(parcel);
}




extern "C"
JNIEXPORT void JNICALL
Java_com_qiumz_ndk_102_Parcel_nativeWriteString(JNIEnv *env, jobject thiz, jlong m_native_prt,
                                                jstring word) {
    Parcel* parcel= reinterpret_cast<Parcel *>(m_native_prt);
    const char* _word=env->GetStringUTFChars(word,NULL);

    parcel->writeString(const_cast<char *>(_word));

    env->ReleaseStringUTFChars(word,_word);


}



extern "C"
JNIEXPORT jstring JNICALL
Java_com_qiumz_ndk_102_Parcel_nativeReadString(JNIEnv *env, jobject thiz, jlong m_native_prt) {
    // TODO: implement nativeReadString()
    Parcel* parcel= reinterpret_cast<Parcel *>(m_native_prt);
    char* str=parcel->readString();
    jstring  content=env->NewStringUTF(reinterpret_cast<const char *>(str));

    return content;

}

调用

       Parcel parcel=new Parcel();
        parcel.writeInt(99);
        parcel.writeInt(88);
        parcel.writeString("hello world");

        parcel.setDataPosition(0);

        System.out.println("读取数据"+parcel.readInt());
        System.out.println("读取数据"+parcel.readInt());
        System.out.println("读取数据"+parcel.readString());

结果

2021-08-13 18:56:00.813 7266-7266/com.qiumz.ndk_02 E/qmz: native 读取的str内容:h
2021-08-13 18:56:00.814 7266-7266/com.qiumz.ndk_02 E/qmz: native 读取的str内容:e
2021-08-13 18:56:00.814 7266-7266/com.qiumz.ndk_02 E/qmz: native 读取的str内容:l
2021-08-13 18:56:00.814 7266-7266/com.qiumz.ndk_02 E/qmz: native 读取的str内容:l
2021-08-13 18:56:00.814 7266-7266/com.qiumz.ndk_02 E/qmz: native 读取的str内容:o
2021-08-13 18:56:00.814 7266-7266/com.qiumz.ndk_02 E/qmz: native 读取的str内容: 
2021-08-13 18:56:00.814 7266-7266/com.qiumz.ndk_02 E/qmz: native 读取的str内容:w
2021-08-13 18:56:00.814 7266-7266/com.qiumz.ndk_02 E/qmz: native 读取的str内容:o
2021-08-13 18:56:00.814 7266-7266/com.qiumz.ndk_02 E/qmz: native 读取的str内容:r
2021-08-13 18:56:00.814 7266-7266/com.qiumz.ndk_02 E/qmz: native 读取的str内容:l
2021-08-13 18:56:00.814 7266-7266/com.qiumz.ndk_02 E/qmz: native 读取的str内容:d
2021-08-13 18:56:00.814 7266-7266/com.qiumz.ndk_02 I/System.out: 读取数据99
2021-08-13 18:56:00.814 7266-7266/com.qiumz.ndk_02 I/System.out: 读取数据88
2021-08-13 18:56:00.814 7266-7266/com.qiumz.ndk_02 I/System.out: 读取数据hello world

相关文章

网友评论

      本文标题:NDK开发之路2-手动实现Parcel

      本文链接:https://www.haomeiwen.com/subject/uwejbltx.html