1

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

4

4 回答 4

1

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

http://dev.cs.ovgu.de/java/Books/JDCBook/jnistring.html

  JNIEXPORT jbyteArray JNICALL Java_ReadFile_loadFile
    (JNIEnv * env, jobject jobj, jstring name) {
      caddr_t m;
      jbyteArray jb;
      struct stat finfo;
      jboolean iscopy;
      const jchar *mfile = (*env)->GetStringChars(env, 
        name, &iscopy);
  //...
      (*env)->ReleaseStringChars(env, name, mfile);
于 2010-01-20T13:48:01.490 回答
1

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

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

于 2009-01-23T08:24:02.157 回答
0

你的问题不是很清楚。

假设您在 C 中有一些字节表示字符,最好的办法是将这些字节转换为 Java,然后使用 Java 的字节转换将它们转换为文本。

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

我以前做过后一件事,所以这里是代码仅供参考。这个 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;                                                                                                        
    }                                                                                                                       
于 2009-01-24T06:56:54.207 回答
0

你不需要转换它们。jbyteArray 和 char* 类型是兼容的。

Java 声明:

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

C声明:

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 函数之前初始化字节数组的长度。

于 2009-01-26T22:59:15.267 回答