2013-03-08 39 views
3

我現在正在編寫一個JNI版本的舊版本的c/C++代碼,我在今年早些時候編寫了一個包含在我的android應用程序中的代碼。我寫了一個相當於我在Java和C++中編寫的桌面應用程序,性能差異突出,因此我想利用ndk。JNI和舊的C++代碼

我對JNI非常陌生,並且我理解事物的方式,似乎我必須做一些類型映射; jdouble來代替doublejint來代替int等等。事情是,雖然我試着運行一些我的舊代碼不變,它的工作!我甚至有一些STL庫(listvector),我沒有遇到任何問題。我剛剛在Android.mk文件中包含APP_STL := stlport_static

所以我的問題是:在這樣做有性能損失?我應該注意到其他風險嗎?在我的jni中使用C/C++基元類型的缺點是什麼?我可以讓代碼運行得更快,還是我不應該打擾?

感謝,

NAX

回答

2

本地類型的JNI(jint,...)都只是typedef的C類型的別名。當內部Java表示不完全匹配C時,它們存在代碼可移植性,即關於位大小。所以,在混合它們時不應該有任何性能開銷。

混合它們的風險或缺點是,如果它們在某些平臺中具有不同的位尺寸,則在來回轉換時可能會丟失位。因此,您可能希望在構建代碼時進行一些額外的檢查,以確保其安全。

+0

嗯,這是令人放心的!非常感謝 – naxchange 2013-03-08 10:16:49

+1

特別是,Java類型具有明確定義的寬度和符號 - 「jint」是一個有符號的32位值,「jlong​​」是一個有符號的64位值,「jchar」是一個無符號的16位價值等。這些不會因平臺而異。請參閱http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html – fadden 2013-03-09 01:01:19