JNI如何将值传递给指针参数

时间:2014-03-25 07:44:19

标签: java android c android-ndk java-native-interface

我正在开发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没有? 再次感谢!

2 个答案:

答案 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记忆。