Skip to content

当在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 = 0JNI_TRUE = 1

返回Java基本类型

Java的8种基本类型: char,byte,short,int,long,float,double,boolean

下面简单演示返回8种基本类型的方法。 新建BaseParam.javabaseparam.cpp文件。分别实现native方法与c方法。

模块名字为fisher-pole

static {
    System.loadLibrary("fisher-pole");
}

char

public native char nChar();
extern "C"
JNIEXPORT jchar JNICALL
Java_com_rustfisher_fishpole_worker_BaseParam_nChar(JNIEnv *env, jobject thiz) {
    return 'a';
}

返回char a

byte

public native byte nByte();
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

public native short nShort();
extern "C"
JNIEXPORT jshort JNICALL
Java_com_rustfisher_fishpole_worker_BaseParam_nShort(JNIEnv *env, jobject thiz) {
    short s = 128;
    return s;
}

返回short 128

int

public native int nInt();
extern "C"
JNIEXPORT jint JNICALL
Java_com_rustfisher_fishpole_worker_BaseParam_nInt(JNIEnv *env, jobject thiz) {
    return 42;
}

返回int 42

long

public native long nLong();
extern "C"
JNIEXPORT jlong JNICALL
Java_com_rustfisher_fishpole_worker_BaseParam_nLong(JNIEnv *env, jobject thiz) {
    long res = 123456789;
    return res;
}

返回long 123456789

float

public native float nFloat();
extern "C"
JNIEXPORT jfloat JNICALL
Java_com_rustfisher_fishpole_worker_BaseParam_nFloat(JNIEnv *env, jobject thiz) {
    return 3.14159F;
}

返回float 3.14159

double

public native double nDouble();
extern "C"
JNIEXPORT jdouble JNICALL
Java_com_rustfisher_fishpole_worker_BaseParam_nDouble(JNIEnv *env, jobject thiz) {
    return 3.141592658;
}

返回double 3.141592658

boolean

public native boolean nBool();
extern "C"
JNIEXPORT jboolean JNICALL
Java_com_rustfisher_fishpole_worker_BaseParam_nBool(JNIEnv *env, jobject thiz) {
    return JNI_FALSE;
}

返回boolean false