2013-03-08 49 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