문제

C / JNI 측에서 Java의 바이트 []와 같은 것으로 숯 배열을 복사하는 것을 다루는 StackoverFlow에서 많은 튜토리얼 / 질문을 발견했지만 다른 방법은 아닙니다.

바이트 어레이를 기대하는 기본 C 라이브러리를 사용하고 있습니다. 나는 단순히 Java의 Byte []에서 데이터를 얻고 싶다.

짧은 이야기 : JNI의 JbytearRay에서 데이터를 복사하는 가장 좋은 방법은 무엇입니까? 크기를 감지하는 방법이 있습니까?

도움이 되었습니까?

해결책

다음은 제가 AS/400 JNI 라이브러리에서 들어 올려 큐의 존재를 테스트하기 위해 기본 사용자 큐 포인터를 해결하기 위해 방금 들어 올린 작업 예입니다. 큐 라이브러리와 Java Byte 배열 (이미 작업의 CCSID)에서 기본 코드로 이름을 복사합니다. 그리고 그것을 사용합니다. 릴리스 기능 호출을 기록하십시오. 기본 배열 컨텐츠를 Java Byte 배열로 다시 복사하여 데이터를 다른 방식으로 이동하도록 변경할 수 있습니다.

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; }                                                                                           
    }                                                                                                                       

다른 팁

자바 바이트 []를 네이티브에 복사하는 가장 좋은 방법 char* 사용하는 것입니다 GetByteArrayRegion 전화. 바이트 배열의 전부 또는 일부를 기본 버퍼에 복사합니다.

사용 GetByteArrayElements/ReleaseByteArrayElements VM의 구현에 따라 두 번의 호출이 필요하며 GC가 이동하지 못하도록 메모리에서 바이트 []를 고정하거나 기본 코드를 방해하지 않고 GC가 원본을 자유롭게 이동할 수 있도록 사본을 유발합니다. (이것은 또한 그것을 의미합니다 JNI_ABORT 버퍼가 고정되었는지 또는 복사되었는지에 따라 "취소"가 변경되거나 그대로 남게됩니다.)

(또한 "지역 호출"섹션 참조 JNI 팁 문서.)

그만큼 GetArrayLength 호출을 사용하여 크기를 결정할 수 있습니다. byte[].

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top