2023-01-20 381
我试图将字符阵列从爪哇传递到c.我已经搜索了实施它的方法.但是,当我尝试访问数组的值时,值不正确.
实际上,我试图给数组一个角色.就像buffer[i]=’z’一样,结果在Android中是正确的.
btw,我想要的值是RS232发送的值. RS232的值还可以.
有人告诉我使用bytearray.它可以工作吗?我担心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++;
}
JNI.c
JNIEXPORT jint JNICALL Java_com_example_ndk_Vehicles_READ(JNIEnv *env, jclass
cls,jcharArray databuffer)
{
char tmp[40];
jchar *buffer=(*env)->GetCharArrayElements(env,databuffer,0);
memset(tmp,0,sizeof(tmp));
PollComport(16,tmp,40); //will the problem here ? This function need a unsigned char[]
//,but in the c program I wrote , char[] was ok for this.
memcpy(buffer,tmp,40);
(*env)->ReleaseCharArrayElements(env, databuffer, buffer, 0);
return 0;
}
这是一个快速示例
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);
因此,您可能正在操作完成后被丢弃的副本.而不是getChararRayElements(),而是在C ++中的本地阵列上操作并使用SetChararRayregion()复制它们.
以上所述是小编给大家介绍的Android Java JNI和C的Char数组 无法识别数值,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!
原文链接:https://77isp.com/post/25954.html
=========================================
https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态