NDK开发之路2-手动实现Parcel
2021-08-13 本文已影响0人
HardMan
即上一篇写完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