Android Java JNI и C Char массив Не может распознать значение - PullRequest
7 голосов
/ 21 августа 2011

Я попытался передать массив char из java в c.Я нашел способ реализовать это.Но когда я пытался получить доступ к значению массива, это значение было неправильным.

На самом деле я пытался присвоить массиву символ.Точно так же, как buffer[i]='z', и результат правильный в Android.

Кстати, требуемое значение было значением, отправленным 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;
}

Ответы [ 2 ]

0 голосов
/ 23 марта 2015

Потому что GetCharArrayElements () разрешено делать копию массива Java и вместо этого вручать вам указатель на копию. В вашем коде вы передаете null для аргумента указатель на логическое значение, которое сообщит вам, была ли сделана копия:

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

Таким образом, вы, скорее всего, работаете с копией, которая будет удалена, когда вы закончите. Вместо GetCharArrayElements () работайте с локальным массивом в C ++ и используйте SetCharArrayRegion () для их копирования.

0 голосов
/ 05 декабря 2012

Вот краткий пример

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...