字节流/ C / JNI

时间:2009-01-23 08:18:00

标签: java c java-native-interface

C API实现中通常使用哪些数据类型来存储字节流? 如何将此类型转换为jbyteArray?

4 个答案:

答案 0 :(得分:1)

那是(const)unsigned char *,表示一个自己保存字节的内存块,再加上一个size_t,告诉你字节数。

This thread似乎讨论了如何创建合适的Java类型(NewByteArray()是函数)。

答案 1 :(得分:1)

请参阅Java_ReadFile_loadFile示例,它们使用NewByteArray()并直接返回。

http://java.sun.com/developer/onlineTraining/Programming/JDCBook/jnistring.html

答案 2 :(得分:0)

你的问题不是很清楚。

假设C中有一些字节代表字符,最好的办法是将字节转换为Java并使用Java的字节转换将它们转换为文本。

在JNI中,您只需要通过使用JNI实例化一个Java数组,或者通过将引用作为参数传递(您仍然需要在JNI代码中“实现”指针)来实现Java数组。 / p>

我之前做过这件事,所以这里是代码FYI。此JNI调用使用AS / 400 C API读取数据库记录并将字节返回给Java - 然后Java代码使用记录格式信息将字段提取到字符串中。希望这有一些帮助:

JNIEXPORT jboolean JNICALL Java_com_xxx_DB2File_jniRead(JNIEnv *jep, jobject thsObj,                    
 jlong handle, jint readOp, jbyteArray jvaDta, jint jvaDtaMax, jint flags) {                                                
    OBJDTA           *odp;                                                                                                  
    jbyte            *jniDta;                                                                                               
    _RIOFB_T         *fbp;                                                                                                  

    thsObj=thsObj;                                                                                                          
    if((odp=getDataspace(handle))==NULL) {                                                                                  
        throwEscape(jep,90003,"Invalid handle for dataspace in jniRead()");                                                 
        return JNI_FALSE;                                                                                                   
        }                                                                                                                   
    jniDta=(*jep)->GetByteArrayElements(jep,jvaDta,0);                                                                      

    // read database record here

    if(fbp->num_bytes<=0) {                                                                                                 
        (*jep)->ReleaseByteArrayElements(jep,jvaDta,jniDta,JNI_ABORT); /* do not copy changed array back to java */         
        return JNI_FALSE;                                                                                                   
        }                                                                                                                   
    if(fbp->num_bytes!=odp->rcdLen) {                                                                                       
        byte             errtxt[201];                                                                                       

        asd_errtxt(errno,errtxt,sizeof(errtxt));                                                                            
        (*jep)->ReleaseByteArrayElements(jep,jvaDta,jniDta,JNI_ABORT); /* do not copy changed array back to java */         
        throwEscape(jep,90204,"Native function jniRead failed.  Got %i, expected %i (%s)",fbp->num_bytes,odp->rcdLen,       
         errtxt);                                                                                                           
        return JNI_FALSE;                                                                                                   
        }                                                                                                                   
    (*jep)->ReleaseByteArrayElements(jep,jvaDta,jniDta,0); /* copy changed array back to java */                            
    return JNI_TRUE;                                                                                                        
    }                                                                                                                       

答案 3 :(得分:0)

您无需转换它们。类型jbyteArray和char *是兼容的。

Java声明:

private static native int doSomething(bate[] string, int length);

C delaration:

JNIEXPORT jint JNICALL Java_package_class_doSomething(JNIEnv *env, jclass jc, jbyteArray string, jint length) {
    int i;
    for (i = 0; i < length; i++) {
        // read string[i]
    }
}

您可以以相同的方式将值传递回java。但是在调用C函数之前,请确保初始化字节数组的长度。