Java JNI如何将值传递给指针参数
我正在从事安卓系统的开发。我有一个带指针参数的本机方法:Java JNI如何将值传递给指针参数,java,android,c,android-ndk,java-native-interface,Java,Android,C,Android Ndk,Java Native Interface,我正在从事安卓系统的开发。我有一个带指针参数的本机方法: int writeData(unsigned char* readbuff, int length) 我想把值传递给readbuff指向的地址。我是这样做的: int readData(unsigned char* readbuff, int length){//unsigned *readbuff = 'a'; return 0; } void test(){ unsigned char* readbuff
int writeData(unsigned char* readbuff, int length)
我想把值传递给readbuff指向的地址。我是这样做的:
int readData(unsigned char* readbuff, int length){//unsigned
*readbuff = 'a';
return 0;
}
void test(){
unsigned char* readbuff = "this is jni";
readData(readbuff);
}
void test(){
unsigned char readbuff[11] = "this is jni"; //edit here
readData(readbuff);
}
但它失败了:
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 );
}
但我还是犯了同样的错误。。。
请帮忙
部分解决强>
我试了很多次,终于让应用程序运行起来。我只是这样更改test():
int readData(unsigned char* readbuff, int length){//unsigned
*readbuff = 'a';
return 0;
}
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不行?
再三感谢 您必须使用memcpy而不是赋值='a'(假设您谈论的是C,您在那里使用了很多标记^^)
两者的区别
unsigned char* readbuff = "this is jni";
及
是指向字符串文字的第一个字符,不能对其进行修改。第二个是包含相同字符串的本地字符数组,但是可以自由修改字符数组
但是,请注意,数组太小,只有一个字符。缺少最后一个NUL字节的空间。如果希望数组的长度与所需长度完全相同,可以说
unsigned char readbuff[] = "this is jni";
更新:
要动态地执行同样的操作,您可以
void test(){
unsigned char* readbuff = malloc(256);
readData(readbuff);
}
但是您最终一定不要忘记内存。您没有检查
长度
,如果0
或readbuff
结果为null
,该怎么办?在任何情况下,信号都会告诉您实际上正在试图修改readbuff
上的内容,但系统不允许您这样做。很可能是因为传递的指针无效(或者根本没有指针值)。谢谢mabi。我将检查代码添加到方法中。readbuff不为空。但同样的错误,你在这里不使用JNI。这只是一个C函数调用另一个C函数。如果您使用JNI,例如从Java调用C函数,您需要在Java端声明一个方法,在C端声明一个适当的实现。我只是不在这里打印Java和jni接口代码。因为我认为这个问题与java sideint readData(unsigned char*readbuff,int length)无关{//unsigned JNIEnv env;unsigned char tmpbuff=“abc”;memcpy(readbuff,tmpbuff,3);非常感谢您的回答!我如上所述添加了memcpy,但出现了相同的错误。使用memcpy而不是直接赋值,不会改变这里的任何内容。如果内存指针未初始化或不可访问,它将给出分段错误。非常感谢!这是否意味着首先添加malloc并将地址提供给*readbuff与readbuff[11]的效果相同?