2011-06-10 96 views
39

虽然有关于转动jstring到本地字符串(string nativeString = env->GetStringUTFChars(jStringVariable, NULL);)文档我找不到这将转换为jbooleanbooljintint的例子。转换JNI类型本地类型

任何人都可以建议这是如何实现的吗?

回答

42

你只需要使用C风格转换将jint转换为intjbooleanbool(如果您使用的是C99 bool类型)或uint8_t(如果您使用的是std int类型)或unsigned char

打开$NDK_ROOT/platforms/android-8/arch-arm/usr/include/jni.h,你会看到jint,jboolean等只是typedef s。

+7

你的意思是int intValue =(int)jIntValue; ? – Graeme 2011-06-10 15:46:41

+1

究竟是什么,C风格演员会做这个工作 – 2011-06-10 15:48:20

+0

啊....也许我应该更新我的问题,然后... – Graeme 2011-06-10 15:48:55

2
+1

根本没有帮助。我理解等价性,但没有对C/C++的深入理解,很难理解这是否意味着你可以进行类型转换。 – Graeme 2011-06-10 15:56:53

+10

如果你的职业生涯中你只能使用你知道的技术,或者有足够的时间在使用之前完全吸收同类技术,那么你有幸运的生活。:) jboolean是一个unsigned char的typedef。我不知道如何将其作为“bool”数据类型进行投射。 (看起来简单地用一个(布尔)表示它并不起作用 - 引导我去问这个问题)。 – Graeme 2011-06-11 10:13:24

+0

在C中,任何整数数据类型都等价于布尔值。 0意味着错误,其他的都是真的。无符号字符是一种整数。以防万一,JNI定义了常量JNI_FALSE和JNI_TRUE(等于1)。 – 2012-04-17 14:03:59

21

蒙上了jboolean(可能只包含值JNI_FALSEJNI_TRUE)到本机bool我会用这样的:如果或许jboolean不会从JVM来

(bool)(jboolean == JNI_TRUE) 

,然后测试jboolean != JNI_FALSE可能被认为是更安全的。

+6

这是一个有点限制。我认为(bool)(java_rtn!= JNI_FALSE)更好,因为某些库可能会返回true,因为某些不等于1的整数(以及JNI_TRUE == 1)。 – greg7gkb 2012-12-10 06:13:27

+1

@ greg7gkb嗯,whut?!你在说什么“图书馆”? JVM应该保证从Java传递到C的'boolean'将恰好为0或1. – Alnitak 2015-02-24 11:33:43

+0

@Alnitak如果函数成功,则Windows API的大多数函数返回0,如果函数成功,则返回0。所以,一个函数可以成功并返回一个值,例如28,并且使用这个答案的代码,它会被转换为false。 – BloodShura 2015-11-14 21:03:23

1

奇数是jchar。它被定义为unsigned short,并且取决于您的编译设置,可能与wchar_t等效,也可能不相同。根据您的底层平台,您最好使用UTF8字符串。至少那些字符的ASCII子集与ASCII等价。

但是,在Windows和Mac OS/Cocoa上,本机宽字符串表示正好是unsigned short。 Java字符串自然适合于此。

1

如果你只是想在使用它,如果(..)语句,这是为我工作,无需转换:

if (jboolean == true) { 
    return true; 
} else { 
    return false; 
} 
3

同样的问题,固定。在我的情况下,我使用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); 
} 


}