android JNI调用

几种传递方式

传递字符串

jint SerialSend(JNIEnv *env, jobject cls, jstring data)
{

    int len = 0;  
    jboolean isCopy;
    const char *str = (*env)->GetStringUTFChars(env, data, &isCopy); 
    if(str == NULL) 
    { 
        return 1; 
    }
     __android_log_print(ANDROID_LOG_DEBUG, "send data", "send data= %s: send len=%d",str,strlen(str)); 
    if(strncmp(str,"quit",4)==0)
    {
     ioctl(ledfd, 0,1);
     LOGD("quit quit quit");    
     return 0; 
    }
    len = write(fd, str, strlen(str));//瀹為檯鍐欏叆鐨勯暱搴?
    if(len == strlen(str)) { 
     LOGD("send data len = %d", len);

        return len; 
    } else { 
        tcflush(fd, TCOFLUSH);//TCOFLUSH鍒锋柊鍐欏叆鐨勬暟鎹絾涓嶄紶閫?
        return -1; 
    }
    (*env)->ReleaseStringUTFChars(env, data, str);
    return 0; 
}

 传递字节数组

unsigned char str[512];
jint SerialSend(JNIEnv *env, jobject cls, jbyteArray buffer,jint datalen)
{
     int len; 
      memset(str,0,512);
    (*env)->GetByteArrayRegion(env, buffer, 0, datalen,str);

     __android_log_print(ANDROID_LOG_DEBUG, "send data", "send data= %s: send len=%d",str,strlen(str)); 

    len = write(fd, str, strlen(str));//瀹為檯鍐欏叆鐨勯暱搴?
    LOGD("write data len = %d", len);
    if(len==10)
    {
     ioctl(ledfd, 0,1);
     LOGD("quit quit quit");    
     return 0; 
    }
    if(len == strlen(str)) { 
     LOGD("send data len = %d", len);
        return len; 
    } else { 
        tcflush(fd, TCOFLUSH);//TCOFLUSH鍒锋柊鍐欏叆鐨勬暟鎹絾涓嶄紶閫?
        return -1; 
    }
    return 0; 
} 

 返回字符串

jstring SerialRecv(JNIEnv *env, jobject cls,jint datalen)
{ 
    int len=0, ret = 0; 
    fd_set fs_read; 
    struct timeval tv_timeout; 
     char *data;
    FD_ZERO(&fs_read); 
    FD_SET(fd, &fs_read); 
    tv_timeout.tv_sec  = (10*20/115200+2); 
    tv_timeout.tv_usec = 0; 

    ret = select(fd+1, &fs_read, NULL, NULL, &tv_timeout); 
    printf("ret = %d\n", ret);  
    if (FD_ISSET(fd, &fs_read)) { 
        len = read(fd, data, datalen);
     LOGD("receive data len = %d", len);
     return (*env)->NewStringUTF(env, data);
     } else {
        perror("select"); 
        return NULL;
    }



}
返回字节数组

char data[1024];
jbyteArray JNICALL SerialRecv(JNIEnv *env, jobject cls,jint datalen)
{
     int len;

     memset(data,0,1024);  
     len = read(fd, data, 1024);
     LOGD("receive data len = %d", len);
     jbyteArray byteArray = (*env)->NewByteArray(env, len);
     (*env)->SetByteArrayRegion(env, byteArray, 0, len, data);

     return byteArray;


}


参考博客
http://blog.csdn.net/yf210yf/article/details/12113567
http://blog.csdn.net/xinchen200/article/details/25333047

猜你喜欢

转载自blog.csdn.net/u012855539/article/details/77948191
今日推荐