2013-03-08 1 views
3

나는 올해 안에 쓴 이전 C/C++ 코드의 JNI 버전을 작성하여 안드로이드 응용 프로그램에 포함합니다. 필자는 Java와 C++ 모두에서 쓰고있는 것과 동일한 데스크탑 애플리케이션을 작성했으며, 성능 차이가 두드러 졌기 때문에 ndk를 활용하고 싶습니다.JNI와 오래된 C++ 코드

나는 JNI에 매우 익숙하며, 내가 이해할 수있는 방식으로, 어떤 타입 매핑을해야만하는 것으로 보인다. jdouble을 사용하여 double, jint을 바꿔 int 등으로 바꿉니다. 문제는, 나는 옛날 코드를 변경하지 않고 실행하려고 시도했다. 심지어 일부 STL 라이브러리 (listvector)가 포함되어 있어도 문제가 없습니다. 방금 Android.mk 파일에 APP_STL := stlport_static을 포함 시켰습니다.

제 궁금한 점은 : 성능 저하가 있습니까? 내가 알아야 할 다른 위험이 있습니까? 내 jni에서 C/C++ 기본 유형을 사용할 때의 단점은 무엇입니까? 코드를 더 빠르게 실행할 수 있습니까, 아니면 신경 쓰지 않아도됩니까?

감사합니다,

NAX JNI에서

답변

2

기본 유형 (jint는 ...) C 유형의 단지 typedef 별칭이다. 내부 Java 표현이 C와 정확히 일치하지 않을 때, 즉 비트 크기와 관련하여 코드 이식성을 위해 존재합니다. 따라서 혼합시 성능 오버 헤드가 없어야합니다.

이들을 혼합 할 때의 위험 또는 단점은 일부 플랫폼에서 비트 크기가 다른 경우 앞뒤로 변환 할 때 비트가 손실 될 수 있다는 것입니다. 따라서 안전하다는 것을 확인하기 위해 코드를 작성할 때 몇 가지 추가 검사를 수행하려고 할 수 있습니다.

+0

음, 안심 이군요! 고맙습니다. – naxchange

+1

특히 자바 타입은 잘 정의 된 폭과 부호가 있습니다 -'jint'는 부호있는 32 비트 값이고'jlong'은 부호있는 64 비트 값이고'jchar'는 부호없는 16 비트 값입니다 값, 등등. 이들은 플랫폼에 따라 다르지 않습니다. http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html을 참조하십시오. – fadden

관련 문제