java——JNI———-C
JNI相当于是翻译,将java类型的数据翻译为c能够识别的类型和
将c类型的数据翻译为java能够识别的类型
1、JNI对基本数据类型的处理
基本数据类型里面的值都可以直接返回得到
基本数据类型有哪些:
也就是java的八大基本类型
byte short int long
float double
boolean char
示例:jint ==int
2、JNI对复杂类型数据类型的处理
复杂类型有哪些:
这里只对其中比较常见的进行了处理,主要是字符串和数组两种
基本的操作样式
java——–jni———-c
在jni里面 通过env->New得到的类型是java的相关类型
通过env->Get得到的类型是c的相关类型
通过Get得到的c的相关类型 ,需要在得到数据之后Release掉
1)、对字符串的处理
java —-jni ——-c
JNIEXPORT void JNICALL Java_com_tjstudy_jnidemo_Jni_getString
(JNIEnv * env, jclass jcs,jstring str){
//1、jstring 转c
// 将jstring类型的str转换为c能够识别的类型
char *chars = (char *) env->GetStringUTFChars(str, JNI_FALSE);
//这个chars c就能够使用了
//释放资源
env->ReleaseStringUTFChars(str,chars);
//2、c转jstring
jstring jtr = env->NewStringUTF(chars);
}
demo:
场景,在android端写一段字符串,经过jni 返回 hello 这个字符串
JNIEXPORT jstring JNICALL Java_com_tjstudy_jnidemo_Jni_getbackString
(JNIEnv *env, jclass jcs, jstring jstr) {
//需要处理jstr 在jstr前面加上 hello
//1、需要将其变成c的格式
char *cstr = (char *) env->GetStringUTFChars(jstr, JNI_FALSE);
char buf1[1024];
//指针是指向某一个位置 这里将该位置设置为空 则表示该位置实质上是不存在的
//简单来说 要存储值,就要有存储值得那个位置 这里没有指定位置 所以是错的
//char *buf1 = NULL;
sprintf(buf1, "hello %s", cstr);
//memset(buf1, '0', 1024);
env->ReleaseStringUTFChars(jstr, cstr);
return env->NewStringUTF(buf1);
}
使用
env->GetStringUTFRegion(jstr, 0, len, buf + 7); 对字符串的操作
JNIEXPORT jstring JNICALL Java_com_tjstudy_jnidemo_Jni_getbackString
(JNIEnv *env, jclass jcs, jstring jstr) {
jsize len = env->GetStringLength(jstr);
char buf[128] = {"hello 12"};
//char *pBuf = buf+7;
//*pBuf表示的是指针指向buf的第7个位置
//也就是说 pBuf也是buf的一部分了 对pBuf的修改buf也会修改
env->GetStringUTFRegion(jstr, 0, len, buf + 7);
//将长度为len的jstr 复制到buf里面的第7个位置后面 可以直接写pBuf
return env->NewStringUTF(buf);
}
2)、对数组的处理
JNIEXPORT jint JNICALL Java_com_tjstudy_jnidemo_Jni_sumArray
(JNIEnv *env, jclass jcs, jintArray jarray) {
//需实现功能:计算数组里面的数值的和
//jarray是java类型能够识别的 需要转换成c能够识别的数组
//1、需要创建一个c的数组 大小和java的相同------获取java的数组的长度
int j_len = env->GetArrayLength(jarray);
//2、创建同等长度的数组
//c要的是字节数
jint *carray = (jint *) malloc(sizeof(jint) * j_len);
//初始化缓冲区
memset(carray,0,sizeof(jint)*j_len);//不知道为什么要 不要也正常
//3、拷贝数组
env->GetIntArrayRegion(jarray, 0, j_len, carray);
int sum = 0;
for (int i = 0; i < j_len; i++) {
sum += i;
}
free(carray);
return sum;
}