代码之家  ›  专栏  ›  技术社区  ›  Daniel Sloof

使用JNI复制字节缓冲区

  •  16
  • Daniel Sloof  · 技术社区  · 16 年前

    我使用的是本机C库,它需要一个字节数组。我只想从java中的字节[]中获取数据,最好是C中的无符号字符[]。

    长话短说:在JNI中,从jBytearray复制数据的最佳方式是什么?有没有办法检测它的大小?

    2 回复  |  直到 16 年前
        1
  •  17
  •   L. Cornelius Dol    12 年前

    下面是我刚刚从AS/400 JNI库中提取的一个工作示例,用于解析本机用户队列指针以测试队列的存在性—它将队列库和名称从Java字节数组(已转换为作业的CCSID)复制到本机代码中并使用它。注意释放函数调用;可以更改这些设置,将本机数组内容复制回Java字节数组,以另一种方式移动数据:

    JNIEXPORT jboolean JNICALL Java_com_mycompany_jni400_UserQueue_jniResolve(JNIEnv *jep,jobject thsObj,                
    jbyteArray queueLibrary,jbyteArray queueName) {                                                                             
        jbyte            *lib,*nam;                                                                                             
        bool             rtn;                                                                                                   
    
        thsObj=thsObj;                                                                                                          
        lib=(*jep)->GetByteArrayElements(jep,queueLibrary,0);                                                                   
        nam=(*jep)->GetByteArrayElements(jep,queueName,0);                                                                      
        rtn=(usrq_resolve((byte*)lib,(byte*)nam)!=NULL);                                                                        
        (*jep)->ReleaseByteArrayElements(jep,queueLibrary,lib,JNI_ABORT); /* abort to not copy back contents */                 
        (*jep)->ReleaseByteArrayElements(jep,queueName   ,nam,JNI_ABORT); /* abort to not copy back contents */                 
        if(rtn) { return JNI_TRUE;  }                                                                                           
        else    { return JNI_FALSE; }                                                                                           
        }                                                                                                                       
    
        2
  •  18
  •   Kimi    13 年前

    将Java字节[]复制到本机 char* GetByteArrayRegion

    使用 GetByteArrayElements / ReleaseByteArrayElements 需要两个调用,而不是一个,并且根据VM的实现,将要么在内存中固定字节[],以防止GC移动它,要么创建副本,以便GC可以在不中断本机代码的情况下自由移动原始代码(这也意味着 JNI_ABORT

    (另请参见 JNI Tips 文件。)

    GetArrayLength 调用可用于确定 byte[]

    推荐文章