作者:朱金灿
来源:clever101的专栏
JNI程序如何传递常用参数和返回值
由于JNI程序涉及到Java程序和C++程序的交互,因此需要考虑如何传递常用参数和返回值。
Java数据类型与JNI类型映射
Java中的基本类型包括boolean,byte,char,short,int,long,float,double,如果你用这几种类型做native方法的参数,当你通过javah工具生成.h文件的时候,这些基本类型分别对应的类型是 jboolean,jbyte,jchar,jshort,jint,jlong,jfloat,jdouble。因此基本类型的传递是可以直接传递的。下面是详细的Java数据类型与jni类型映射表:
Java类型 | 本地类型 | 描述 |
---|---|---|
boolean | jboolean | C/C++8位整型 |
byte | jbyte | C/C++带符号的8位整型 |
char | jchar | C/C++无符号的16位整型 |
short | jshort | C/C++带符号的16位整型 |
int | jint | C/C++带符号的32位整型 |
long | jlong | C/C++带符号的64位整型 |
float | jfloat | C/C++32位浮点型 |
double | jdouble | C/C++64位浮点型 |
Object | jobject | 任何Java对象,或者没有对应java类型的对象 |
Class | jclass | Class对象 |
String | jstring | 字符串对象 |
Object[] | jobjectArray | 任何对象的数组 |
boolean[] | jbooleanArray | 布尔型数组 |
byte[] | jbyteArray | 比特型数组 |
char[] | jcharArray | 字符型数组 |
short[] | jshortArray | 短整型数组 |
int[] | jintArray | 整型数组 |
long[] | jlongArray | 长整型数组 |
float[] | jfloatArray | 浮点型数组 |
double[] | jdoubleArray | 双浮点型数组 |
String参数的传递和返回
Java的String和C++的string是不能对等起来的,所以需要额外进行处理。具体就是使用GetStringUTFChars函数将jstring类型变成一个char*类型,返回的时候,要生成一个jstring类型的对象,也必须通过NewStringUTF函数来构造。下面是示例代码:
JNIEXPORT jstring JNICALL Java_com_developerworks_HelloJNI_getLine
(JNIEnv* env, jobject obj, jstring prompt)
{
const char* str;
str = env->GetStringUTFChars(prompt, false);
if (str == NULL)
{
return NULL; /* OutOfMemoryError already thrown */
}
std::cout<<str<<std::endl;
env->ReleaseStringUTFChars(prompt, str);
char* tmpstr = "return string succeeded";
jstring rtstr = env->NewStringUTF(tmpstr);
return rtstr;
}
数组类型的传递
和String一样,JNI为Java基本类型的数组提供了jArray类型,比如int[]对应的就是jintArray。来看一个传递int数组的例子,具体是用GetArrayLength函数来获取数组的长度,使用GetIntArrayElements函数将jintArray转换为jint类型。下面是示例代码:
JNIEXPORT jint JNICALL Java_com_developerworks_HelloJNI_sumArray
(JNIEnv *env, jobject obj, jintArray arr)
{
jint* carr = NULL;
carr = env->GetIntArrayElements(arr, false);
if (carr == NULL)
{
return 0; /* exception occurred */
}
int size = env->GetArrayLength(arr);
jint sum = 0;
for (int i = 0; i < size; i++)
{
sum += carr[i];
}
env->ReleaseIntArrayElements(arr, carr, 0);
return sum;
}
后续支持或需要示例代码,请添加VX: explorer101