Java에서 C++로 문자열 매개 변수를 전달하는 JNI 인터페이스를 설계하고 있습니다. 고성능이 필요하고 Direct ByteBuffer 및 String.getBytes()를 사용하여 상당히 잘 수행 할 수 있지만 문자열을 C/C++로 전달할 경우의 불이익은 여전히 상당히 높습니다. 최근에는 Open JDK의 Unsafe 클래스에 대해 읽었습니다. This excellent page 나를 시작 시켰지만 Unsafe가 비참한 것으로 나타 났지만 이해하기 쉽도록 문서화되지 않았습니다.안전하지 않은 포인터 고정
Unsafe 클래스를 사용하여 문자열에 대한 포인터를 얻은 다음 C++에 전달하면 C++ 코드를 입력하기 전에 개체가 이동했을 위험이 있습니까? 그리고 C++이 실행되는 동안에도? 또는 안전하지 않은 코드에 의해 제공된 주소가 어떻게 고정되어 있습니까? 그들이 고정되어 있지 않다면 어떻게 이러한 안전하지 않은 포인터가 유용할까요?
일부 코드를 게시하면 크게 도움이됩니다. 특히 C++ 코드가 Java 비트에서 동기식으로 호출되는지 여부 또는 다중 스레드가 있는지 여부를 확인하는 데 도움이됩니다. 또한, string에 대한 포인터는'char *'또는'std :: string *'을 의미합니까? 코드로 답을 많이 얻었습니다! – Luis
페널티가 UTF-16에서 C++ 코드가 사용하는 인코딩으로 변환되는 것 같습니다. C++ 코드가 카운팅 된 (끝나지 않은) UTF-16을 처리 할 수 있다면'GetStringChars'와'GetStringLength'에서 변환이나 복사가 필요합니다. "문자열에 대한 포인터"가 의미하는 바가 아닙니까? –
Tom. 거기에 아무 것도하지 않더라도 Java-> JNI-> C++에서 객체 (문자열 포함)를 전달할 때 성능 저하가있는 것으로 보입니다. 그 비용은 오래 걸리는 비용보다 상당히 높습니다. 그 비용이 내재적 인 지역 참조를 만드는 데에만 기인하는지는 불확실합니다. 이유가 무엇이든 그 비용은 고통 스럽습니다. 또한 GetStringChars에는 측정 할 수있는 비용이 있습니다. 나는 그것이 바이트의 COPY에 대한 포인터를 받기 때문에 읽었다 고 생각한다. 또는 객체가 고정되어야한다. 어쨌든 당신은 지연을 일으키는 것을 상상할 수 있습니다. – user3624334