我正在开发Android开发。我有一个带有指针参数的本机方法:
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);
}
但我仍然有同样的错误...... 请帮忙!
部分解决了! 我尝试了很多,最后让应用程序运行。我只是改变了测试():
void test(){
unsigned char readbuff[11] = "this is jni"; //edit here
readData(readbuff);
}
但我不擅长C,谁能告诉我为什么readbuff [11]工作但* readbuff没有? 再次感谢!
答案 0 :(得分:0)
你必须使用 memcpy 而不是='a'的赋值(假设你在谈论C,你在那里使用了很多标签^^)
void * memcpy ( void * destination, const void * source, size_t num );
答案 1 :(得分:0)
之间的区别
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);
}
但你最终不能忘记free
记忆。