虽然有关于转动jstring
到本地字符串(string nativeString = env->GetStringUTFChars(jStringVariable, NULL);
)文档我找不到这将转换为jboolean
到bool
或jint
到int
的例子。转换JNI类型本地类型
任何人都可以建议这是如何实现的吗?
虽然有关于转动jstring
到本地字符串(string nativeString = env->GetStringUTFChars(jStringVariable, NULL);
)文档我找不到这将转换为jboolean
到bool
或jint
到int
的例子。转换JNI类型本地类型
任何人都可以建议这是如何实现的吗?
你只需要使用C风格转换将jint
转换为int
。 jboolean
到bool
(如果您使用的是C99 bool
类型)或uint8_t
(如果您使用的是std int类型)或unsigned char
。
打开$NDK_ROOT/platforms/android-8/arch-arm/usr/include/jni.h
,你会看到jint
,jboolean
等只是typedef
s。
根本没有帮助。我理解等价性,但没有对C/C++的深入理解,很难理解这是否意味着你可以进行类型转换。 – Graeme 2011-06-10 15:56:53
如果你的职业生涯中你只能使用你知道的技术,或者有足够的时间在使用之前完全吸收同类技术,那么你有幸运的生活。:) jboolean是一个unsigned char的typedef。我不知道如何将其作为“bool”数据类型进行投射。 (看起来简单地用一个(布尔)表示它并不起作用 - 引导我去问这个问题)。 – Graeme 2011-06-11 10:13:24
在C中,任何整数数据类型都等价于布尔值。 0意味着错误,其他的都是真的。无符号字符是一种整数。以防万一,JNI定义了常量JNI_FALSE和JNI_TRUE(等于1)。 – 2012-04-17 14:03:59
蒙上了jboolean
(可能只包含值JNI_FALSE
或JNI_TRUE
)到本机bool
我会用这样的:如果或许jboolean
不会从JVM来
(bool)(jboolean == JNI_TRUE)
,然后测试jboolean != JNI_FALSE
可能被认为是更安全的。
这是一个有点限制。我认为(bool)(java_rtn!= JNI_FALSE)更好,因为某些库可能会返回true,因为某些不等于1的整数(以及JNI_TRUE == 1)。 – greg7gkb 2012-12-10 06:13:27
@ greg7gkb嗯,whut?!你在说什么“图书馆”? JVM应该保证从Java传递到C的'boolean'将恰好为0或1. – Alnitak 2015-02-24 11:33:43
@Alnitak如果函数成功,则Windows API的大多数函数返回0,如果函数成功,则返回0。所以,一个函数可以成功并返回一个值,例如28,并且使用这个答案的代码,它会被转换为false。 – BloodShura 2015-11-14 21:03:23
奇数是jchar
。它被定义为unsigned short
,并且取决于您的编译设置,可能与wchar_t
等效,也可能不相同。根据您的底层平台,您最好使用UTF8字符串。至少那些字符的ASCII子集与ASCII等价。
但是,在Windows和Mac OS/Cocoa上,本机宽字符串表示正好是unsigned short
。 Java字符串自然适合于此。
如果你只是想在使用它,如果(..)语句,这是为我工作,无需转换:
if (jboolean == true) {
return true;
} else {
return false;
}
同样的问题,固定。在我的情况下,我使用openFrameworks,所以我不知道这是否适用于非openFrameworks项目(尚未测试)。但是,看起来外部函数中的前两个参数始终是“env”和“thiz”,并且需要为每个新的extern函数明确定义这些参数。
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);
}
}
你的意思是int intValue =(int)jIntValue; ? – Graeme 2011-06-10 15:46:41
究竟是什么,C风格演员会做这个工作 – 2011-06-10 15:48:20
啊....也许我应该更新我的问题,然后... – Graeme 2011-06-10 15:48:55