当在C和Java之间传递数字时,应该知道它们彼此之间的对应类型。
例如,C也有int和long的数据类型,但是它们的实现却是取决于平台的。在一些平台上,int类型是16位的,在另外一些平台上是32位的。
然而,在Java平台上int类型总是32位的整数。基于这个原因,Java本地接口定义了jint、jlong等类型。
Java数据类型和C数据类型的对应关系
| Java | C | 字节 |
|---|---|---|
| boolean | jboolean | 1 |
| byte | jbyte | 1 |
| char | jchar | 2 |
| short | jshort | 2 |
| int | jint | 4 |
| long | jlong | 8 |
| float | jfloat | 4 |
| double | jdouble | 8 |
在头文件jni.h中,这些类型被typedef语句声明为在目标平台上等价的类型。
该头文件还定义了常量JNI_FALSE = 0和JNI_TRUE = 1。
返回Java基本类型¶
Java的8种基本类型: char,byte,short,int,long,float,double,boolean
下面简单演示返回8种基本类型的方法。
新建BaseParam.java与baseparam.cpp文件。分别实现native方法与c方法。
模块名字为fisher-pole。
char¶
extern "C"
JNIEXPORT jchar JNICALL
Java_com_rustfisher_fishpole_worker_BaseParam_nChar(JNIEnv *env, jobject thiz) {
return 'a';
}
返回char a
byte¶
extern "C"
JNIEXPORT jbyte JNICALL
Java_com_rustfisher_fishpole_worker_BaseParam_nByte(JNIEnv *env, jobject thiz) {
unsigned char abc = 99;
return abc;
}
返回byte 99
short¶
extern "C"
JNIEXPORT jshort JNICALL
Java_com_rustfisher_fishpole_worker_BaseParam_nShort(JNIEnv *env, jobject thiz) {
short s = 128;
return s;
}
返回short 128
int¶
extern "C"
JNIEXPORT jint JNICALL
Java_com_rustfisher_fishpole_worker_BaseParam_nInt(JNIEnv *env, jobject thiz) {
return 42;
}
返回int 42
long¶
extern "C"
JNIEXPORT jlong JNICALL
Java_com_rustfisher_fishpole_worker_BaseParam_nLong(JNIEnv *env, jobject thiz) {
long res = 123456789;
return res;
}
float¶
extern "C"
JNIEXPORT jfloat JNICALL
Java_com_rustfisher_fishpole_worker_BaseParam_nFloat(JNIEnv *env, jobject thiz) {
return 3.14159F;
}
double¶
extern "C"
JNIEXPORT jdouble JNICALL
Java_com_rustfisher_fishpole_worker_BaseParam_nDouble(JNIEnv *env, jobject thiz) {
return 3.141592658;
}
boolean¶
extern "C"
JNIEXPORT jboolean JNICALL
Java_com_rustfisher_fishpole_worker_BaseParam_nBool(JNIEnv *env, jobject thiz) {
return JNI_FALSE;
}
返回boolean false