将JNItypes转换为本机types
虽然有关于将jstring
转换为本地string的文档( string nativeString = env->GetStringUTFChars(jStringVariable, NULL);
)我找不到将jboolean
转换为bool
或jint
为int
的示例。
任何人都可以build议如何实现?
你只需要使用C风格强制转换jint
int
。 jboolean
与bool
(如果使用C99 bool
types)或uint8_t
(如果使用std inttypes)或unsigned char
。
打开$NDK_ROOT/platforms/android-8/arch-arm/usr/include/jni.h
,你会看到jint
, jboolean
等只是typedef
s。
要将jboolean
(可能只包含值JNI_FALSE
或JNI_TRUE
)转换为本地bool
我会使用类似下面的内容:
(bool)(jboolean == JNI_TRUE)
如果jboolean
不是来自JVM,那么testingjboolean != JNI_FALSE
可能会被认为是更安全的。
同样的问题已修复。 在我的情况下,我使用openFrameworks,所以我不知道这是否适用于非openFrameworks项目(尚未testing)。 然而,看起来外部函数中的前两个参数始终是“env”和“thiz”,并且需要为每个新的外部函数明确定义这些参数。
extern "C"{ // casts the variable properly void Java_com_package_JavaClass_someFunction( JNIEnv* env, jobject thiz, jboolean yourBool ){ myTestApp->someFunction( (bool) yourBool ); } // "yourBool" will always be "1" because its taking the spot of "thiz" which is not null void Java_com_package_JavaClass_someFunction( JNIEnv* env, jboolean yourBool ){ myTestApp->someFunction( (bool) yourBool ); } // "yourBool" will always be "1" because its taking the spot of "env" which is not null void Java_com_package_JavaClass_someFunction( jboolean yourBool ){ myTestApp->someFunction( (bool) yourBool ); } }
奇怪的是jchar
。 它被定义为unsigned short
,取决于你的编译设置,它可能与wchar_t
相等或不相等。 根据您的底层平台,使用UTF8string可能会更好。 至less对于字符的ASCII子集,它们与ASCII等同。
然而,在Windows和Mac OS / Cocoa上,本地宽string表示法正好是unsigned short
。 Javastring自然适合。
如果你只是想在if(..)语句中使用它,这是为我工作,没有转换:
if (jboolean == true) { return true; } else { return false; }
- 如何将C结构来回传递给JNI中的Java代码?
- Android ndk-build忽略APP_ABI:= x86
- Android设备上的OpenGL ES 2.0扩展
- Android NDK C ++ JNI(找不到原生的实现…)
- NDK – 如何在另一个项目中使用生成的.so库
- 在Eclipse中进行Android NDKdebugging – 如何停止只在使用本机代码时才会出现的segfaults / SIGILL
- java.lang.ClassNotFoundException:在path上找不到类:dexpathlist
- System.loadLibrary(…)在我的情况下找不到本地库
- 如何用Android Gradle插件0.7configurationNDK