我正在开发安卓系统。我有一个带指针参数的本机方法:
int writeData(unsigned char* readbuff, int length)
我想将值传递给readbuff指向的地址。我是这样做的:
int readData(unsigned char* readbuff, int length){//unsigned
*readbuff = 'a';
return 0;
}
但它失败了:
Fatal signal 11 (SIGSEGV) at 0x74e9a36e (code=2), thread 14078 (Thread-1916)
我的问题是如何更改readbuff中的值?我找了很多,但还是找不到答案。请帮帮我!
非常感谢!
编辑:
这是我的新代码:
int readData(unsigned char* readbuff){
JNIEnv *env;
unsigned char* tmpbuff = "abc";
if(readbuff==NULL||length < 4)
__android_log_print(ANDROID_LOG_DEBUG, "error", "readbuff is null");
else
memcpy ( readbuff, tmpbuff, 3 );
}
现在该方法的调用方式如下:
void test(){
unsigned char* readbuff = "this is jni";
readData(readbuff);
}
但我还是犯了同样的错误。。。
请帮忙!
部分解决!
我试了很多,终于把应用程序运行起来了。我只是这样更改test():
void test(){
unsigned char readbuff[11] = "this is jni"; //edit here
readData(readbuff);
}
但是我不擅长C语言,谁能告诉我为什么readbuff[11]工作,但是*readbuff不工作?
谢谢你一次又一次!
最佳答案
两者的区别
unsigned char* readbuff = "this is jni";
和
unsigned char readbuff[11] = "this is jni";
是第一个指向字符串文本的字符串,不能对其进行修改。第二个是包含相同字符串的本地char数组,但是char数组可以自由修改。
但是,请注意数组对于一个字符来说太小了。它缺少最后一个NUL字节的空间。如果你想拥有一个数组,只要需要,你可以说
unsigned char readbuff[] = "this is jni";
更新:
要动态地执行相同的操作,可以执行
void test(){
unsigned char* readbuff = malloc(256);
readData(readbuff);
}
但你不能忘记最后的记忆。