Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Java JNI和C字符数组可以';我不认识它的价值_Java_Android_Java Native Interface - Fatal编程技术网

Android Java JNI和C字符数组可以';我不认识它的价值

Android Java JNI和C字符数组可以';我不认识它的价值,java,android,java-native-interface,Java,Android,Java Native Interface,我试图将char数组从java传递到c。我已经在谷歌上找到了实现它的方法。但是当我试图访问数组的值时,该值不正确 事实上,我试图给数组指定一个字符。就像buffer[i]='z',结果在android中是正确的 顺便说一句,我想要的值是rs232发送的值。rs232的值正常 有人叫我用过道。这样行吗?我担心rs232的值无法存储到bytearray中 Java public native int OpenPort(int portnum,int brates); public native in

我试图将char数组从java传递到c。我已经在谷歌上找到了实现它的方法。但是当我试图访问数组的值时,该值不正确

事实上,我试图给数组指定一个字符。就像
buffer[i]='z'
,结果在android中是正确的

顺便说一句,我想要的值是rs232发送的值。rs232的值正常

有人叫我用过道。这样行吗?我担心rs232的值无法存储到bytearray中

Java

public native int OpenPort(int portnum,int brates);
public native int ClosePort(int portnum);
public native int READ(char[] databuffer);

public char[] buffer=new char[40];

int i;

for(i=0;i<40;i++)
    buffer[i]='s';  //initialization

OpenPort(16,9600); // A function to open the rs232 port

while (i<1000)
{
    READ(buffer);
    i++;
}
这里有一个简单的例子

public native int play(String filename_main, String filename_prev, int main_x, int main_y, int main_width, int main_height, int preview_x, int preview_y, int preview_width, int preview_height);
映射到

int play(char* filename_main, char* filename_preview, int main_x, int main_y, int main_width, int main_height, int preview_x, int preview_y, int preview_width, int preview_height)
使用这个JNI调用

JNIEXPORT jint JNICALL Java_com_rtrk_demo_PELib_play(JNIEnv *env, jobject obj, jstring main_video, jstring prev_video, jint main_x, jint main_y, jint main_width, jint main_height, jint prev_x, jint prev_y, jint prev_width, jint prev_height)
{
LOGI("JNICALL - Java_com_rtrk_demo_PELib_play(filename)\n");

const char* utf_main_video = env->GetStringUTFChars(main_video, 0);
const char* utf_prev_video = env->GetStringUTFChars(prev_video, 0);
char* file_main_video = (char*) malloc(strlen(utf_main_video) * sizeof(char) +1);
char* file_prev_video = (char*) malloc(strlen(utf_prev_video) * sizeof(char) +1);
strcpy(file_main_video, utf_main_video);
strcpy(file_prev_video, utf_prev_video);
LOGI("JNICALL - filenames: %s\t%s\n", file_main_video, file_prev_video);
env->ReleaseStringUTFChars(main_video, utf_main_video);
env->ReleaseStringUTFChars(prev_video, utf_prev_video);
LOGI("###JNICALL RET - Java_com_rtrk_demo_PELib_play(%s, %s)\n", file_main_video, file_prev_video);

int retVal = play(file_main_video, file_prev_video, (int)main_x, (int)main_y, (int)main_width, (int)main_height, (int)prev_x, (int)prev_y, (int)prev_width, (int)prev_height);
free(file_main_video);
free(file_prev_video);
return retVal;
}

因为GetCharArrayElements()可以创建Java数组的副本,并将指向副本的指针交给您。在代码中,为指向布尔参数的指针传递null,该参数将告诉您是否创建了副本:

jchar *buffer=(*env)->GetCharArrayElements(env,databuffer,0);

因此,您可能正在对一个副本进行操作,该副本在完成操作后将被丢弃。代替GETCHARARYELMENTSH(),在C++中使用本地数组,使用StCARARRayAuthor()来复制它们。

如果你想把字符数组从java传递到C,我建议你把它们作为char *传递。如果你想使用字节数组,那么使用这个JByTurRayJB;jb=(*env)->NewByteArray(env,finfo.st_size);(*env)->SetByteArrayRegion(env,jb,0,finfo.st_size,(jbyte*)m);关闭(fd);数组可以通过(*env)->ReleaseByteArrayElements(env,jb,(jbyte*)m,0)显式释放;对象数组和基元类型数组之间的区别在于,在构造jobjectarray类型时,Java语言类被用作参数。如何将char[]从Java发送到此JNI调用?String.getBytes()?或者String.getBytes(“UTF-8”)?你把16位的Java
char
和8位的C
char
搞混了。您需要在这里通篇使用Java
byte
,包括您的Java端代码。
jchar *buffer=(*env)->GetCharArrayElements(env,databuffer,0);