当前位置:网站首页>NDK编程--JNI工具类调用
NDK编程--JNI工具类调用
2022-07-20 05:53:00 【果冻cavalierly】
11.工具的作用是将java的字符串转换为c语言中的字符指针代表的字符串<span style="font-size:14px;">//将const char类型转换成jstring类型
jstring CStr2Jstring( JNIEnv* env, const char* pat )
{
// 定义java String类 strClass
jclass strClass = (env)->FindClass("Ljava/lang/String;");
// 获取java String类方法String(byte[],String)的构造器,用于将本地byte[]数组转换为一个新String
jmethodID ctorID = (env)->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V");
// 建立byte数组
jbyteArray bytes = (env)->NewByteArray((jsize)strlen(pat));
// 将char* 转换为byte数组
(env)->SetByteArrayRegion(bytes, 0, (jsize)strlen(pat), (jbyte*)pat);
//设置String, 保存语言类型,用于byte数组转换至String时的参数
jstring encoding = (env)->NewStringUTF("GB2312");
//将byte数组转换为java String,并输出
return (jstring)(env)->NewObject(strClass, ctorID, bytes, encoding);
}
char * Jstring2CStr( JNIEnv * env, jstring jstr )
{
char * rtn = NULL;
jclass clsstring = env->FindClass("java/lang/String");
jstring strencode = env->NewStringUTF("GB2312");
jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");
jbyteArray barr= (jbyteArray)env->CallObjectMethod(jstr,mid,strencode);
jsize alen = env->GetArrayLength(barr);
jbyte * ba = env->GetByteArrayElements(barr,JNI_FALSE);
if(alen > 0)
{
rtn = (char*)malloc(alen+1); //new char[alen+1];
memcpy(rtn,ba,alen);
rtn[alen]=0;
}
env->ReleaseByteArrayElements(barr,ba,0);
return rtn;
}</span>
<span style="font-size:14px;">//将const char类型转换成jstring类型
jstring CStr2Jstring( JNIEnv* env, const char* pat )
{
// 定义java String类 strClass
jclass strClass = (env)->FindClass("Ljava/lang/String;");
// 获取java String类方法String(byte[],String)的构造器,用于将本地byte[]数组转换为一个新String
jmethodID ctorID = (env)->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V");
// 建立byte数组
jbyteArray bytes = (env)->NewByteArray((jsize)strlen(pat));
// 将char* 转换为byte数组
(env)->SetByteArrayRegion(bytes, 0, (jsize)strlen(pat), (jbyte*)pat);
//设置String, 保存语言类型,用于byte数组转换至String时的参数
jstring encoding = (env)->NewStringUTF("GB2312");
//将byte数组转换为java String,并输出
return (jstring)(env)->NewObject(strClass, ctorID, bytes, encoding);
}
char * Jstring2CStr( JNIEnv * env, jstring jstr )
{
char * rtn = NULL;
jclass clsstring = env->FindClass("java/lang/String");
jstring strencode = env->NewStringUTF("GB2312");
jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");
jbyteArray barr= (jbyteArray)env->CallObjectMethod(jstr,mid,strencode);
jsize alen = env->GetArrayLength(barr);
jbyte * ba = env->GetByteArrayElements(barr,JNI_FALSE);
if(alen > 0)
{
rtn = (char*)malloc(alen+1); //new char[alen+1];
memcpy(rtn,ba,alen);
rtn[alen]=0;
}
env->ReleaseByteArrayElements(barr,ba,0);
return rtn;
}</span>
error: conflicting types for 'Jstring2CStr'
note: previous implicit declaration of 'Jstring2CStr' was here
在jni的C语言部分调用会出现以上错误,这是因为在C语言中必须将要被调用的函数放在调用函数的前面来定义,否则会出现找不到函数的问题。
F:/android/Crack1/jni/com_example_crack1_MainActivity.c: In function 'Jstring2CStr':
F:/android/Crack1/jni/com_example_crack1_MainActivity.c:14:27: error: request for member 'FindClass' in something not a structure or union
F:/android/Crack1/jni/com_example_crack1_MainActivity.c:15:28: error: request for member 'NewStringUTF' in something not a structure or union
F:/android/Crack1/jni/com_example_crack1_MainActivity.c:16:24: error: request for member 'GetMethodID' in something not a structure or union
F:/android/Crack1/jni/com_example_crack1_MainActivity.c:17:37: error: request for member 'CallObjectMethod' in something not a structure or union
F:/android/Crack1/jni/com_example_crack1_MainActivity.c:18:21: error: request for member 'GetArrayLength' in something not a structure or union
F:/android/Crack1/jni/com_example_crack1_MainActivity.c:19:21: error: request for member 'GetByteArrayElements' in something not a structure or union
F:/android/Crack1/jni/com_example_crack1_MainActivity.c:26:8: error: request for member 'ReleaseByteArrayElements' in something not a structure or union
又会出现上面这些找到相关方法的问题,解决办法如下:
如果是c程序,要用 (*env)->
如果是C++要用 env->
ps:在linux下如果.c文件中用 “env->” 编译会找不到此结构,必须用“(*env)->”,或者改成.cpp文件,以 c++的方式来编译。
以下是两者的区别:
即C++中使用
env->FindClass("java/lang/String")
C中使用
(*env)->FindClass(env, "java/lang/String")
边栏推荐
- 磁盤管理和文件系統
- Various variables and variable operations of shell
- Extract the characters in the list in comma separated form
- Basic principle and application of NAT
- Disk management and file system
- Progress report of Zhongguancun Software Park Project
- 网络安全架构:安全架构公理
- DNA 6. 基因组变异之绘制精美瀑布图(ComplexHeatmap)
- Mysql 安装
- DOM节点类型
猜你喜欢
手动安装Apache
MySQL installation
JS基础--Object静态方法
IF:14+ “冒烟型”骨髓瘤的分子组成突显了导致多发性骨髓瘤的进化途径
Some analysis of Beijing double line machine room
DNA 11. 識別腫瘤蛋白質三維結構上突變熱點(HotSpot3D)
Kettle optimization to improve MySQL read and write speed
Progress report of Zhongguancun Software Park Project
Quota of disks
一年成为博客专家? 致!奋斗的自己
随机推荐
Development history of Beijing BGP machine room
JS基础--Data
Solve tensoflow2 No module named:tensorflow contrib
静态路由—综合实验
Gestion des disques et systèmes de fichiers
FigDraw 15. SCI 文章绘图之多组学圈图(OmicCircos)
Basic principle and application of NAT
服务器硬件及RAID配置
Game improvement of smart people: Chapter 3 Lesson 1: ISBN (ISBN code)
一年成为博客专家? 致!奋斗的自己
Fun guessing game (not binary search!)
RNA 23. SCI文章中表达基因Cox模型的风险因子关联图(ggrisk)
编程之路,须铸金蝉之势
Extract the characters in the list in comma separated form
C语言基本概念——每天一遍小知识
Comparative analysis of server hosting and self built computer rooms
NAT network address translation
JS笔试题--随机数,数组去重
Keras calls plot_ Model error reporting solution
Gestion des processus et des tâches prévues