Java中数据类型分两类:
primitive types 如int , float , char
reference types 如类,实例, 数组
基本数据类型
Java类型 JNI类型
boolean jboolean
byte jbyte
char jchar
short jshort
int jshort
long jlong
float jfloat
double jdouble
对象类型
Object jobject
Class jclass
String jstring
数组类型
boolean[] jbooleanArray
其他对应
JNI String 相关的函数
const jchar * GetStringChars(JNIEnv *env, jstring str, jboolean *isCopy) 得到Unicode编码的String指针
void ReleaseStringChars(JNIEnv *env, jstring string, const jchar *char) 释放
const jbyte *GetStringUTFChars(JNIEnv *env, jstring string, jboolean *isCopy) 得到UTF编码String指针
void ReleaseStringUTFChars(JNIEnv *env, jstring string, const char *uft)释放
jsize GetStringLength(JNIEnv *env, jstring string)
jsize GetStringUTFLength(JNIEnv *env, jstring string)
jstring NewString(JNIEnv *env, const jchar *uchars, jsize len)
jstring NewStringUTF(JNIEnv *env, const jchar *uchars, jsize len)
const jchar * GetStringCritical(JNIEnv *env, jstring string, jboolean *isCopy)得到编码格式的String指针,返回String的copy值
void RealeaseStringCritical(JNIEnv *env, jstring string, const jchar *carray)
void GetStringRegion(JNIEnv *env, jstring str, jsize start, jsize len, jcahr *buf)
把String的内容复制出来,复制给Unicode编码格式的参数buf (*env)->SetStringRegion
void GetStringUTFRegion()(JNIEnv *env, jstring str, jsize start, jsize len, jcahr *buf)
GetStringUTFRegion有两个主要的参数,start 和 length, 这两个参数以Unicode编码计算. 该函数会做边界检查,所以可能抛出StringIndexOutOfBoundsException。
1
2
3
4
5
6
7
8
9
10
|
Java_com_conowen_test_testActivity_test(JNIEnv *env, jobject obj, jstring str)
{
char
outputbuf[
128
], inputbuf[
128
];
int
len = (*env)->GetStringLength(env, str);
(*env)->GetStringUTFRegion(env, str,
0
, len, outbuf);
printf(
"%s"
, outputbuf);
scanf(
"%s"
, inputbuf);
return
(*env)->NewStringUTF(env, inbuf);
}
|
JNI数组
void Get<type>ArrayRegion(JNIEnv *env, <ArrayType>array, jsize start, jsize len, <nativeType> *buf)
1
2
3
4
5
6
7
8
9
10
11
12
|
Java_IntArray_sumArray(JNIEnv *env, jobject obj, jintArray arr)
{
jint buf[
10
];
jint i, sum =
0
;
(*env)->GetIntArrayRegion(env, arr,
0
,
10
, buf);
for
(i =
0
; i <
10
; i++) {
sum += buf[i];
}
return
sum;
}
JNI中数组的基类为jarray,其他如jintArray都是继承自jarray。
|
使用<NativeType> *Get<Type>ArrayElements(JNIEnv *env,<ArrayType> array, jboolean *isCopy);进行数组操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
Java_IntArray_sumArray(JNIEnv *env, jobject obj, jintArray arr)
{
jint *carr;
jint i, sum =
0
;
carr = (*env)->GetIntArrayElements(env, arr, NULL);
if
(carr == NULL) {
return
0
;
/* exception occurred */
}
for
(i=
0
; i<
10
; i++) {
sum += carr[i];
}
(*env)->ReleaseIntArrayElements(env, arr, carr,
0
);
return
sum;
}
|