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]的效果相同?