当前位置:网站首页>NDK programming -- JNI tool class call
NDK programming -- JNI tool class call
2022-07-21 04:42:00 【Jelly cavalierly】
11. The function of the tool is to java To c String represented by character pointer in language <span style="font-size:14px;">// take const char Type conversion to jstring type
jstring CStr2Jstring( JNIEnv* env, const char* pat )
{
// Definition java String class strClass
jclass strClass = (env)->FindClass("Ljava/lang/String;");
// obtain java String Class method String(byte[],String) Constructor , For local byte[] Convert array to a new String
jmethodID ctorID = (env)->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V");
// establish byte Array
jbyteArray bytes = (env)->NewByteArray((jsize)strlen(pat));
// take char* Convert to byte Array
(env)->SetByteArrayRegion(bytes, 0, (jsize)strlen(pat), (jbyte*)pat);
// Set up String, Save the language type , be used for byte Array conversion to String Time parameters
jstring encoding = (env)->NewStringUTF("GB2312");
// take byte Array to java String, And the output
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;">// take const char Type conversion to jstring type
jstring CStr2Jstring( JNIEnv* env, const char* pat )
{
// Definition java String class strClass
jclass strClass = (env)->FindClass("Ljava/lang/String;");
// obtain java String Class method String(byte[],String) Constructor , For local byte[] Convert array to a new String
jmethodID ctorID = (env)->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V");
// establish byte Array
jbyteArray bytes = (env)->NewByteArray((jsize)strlen(pat));
// take char* Convert to byte Array
(env)->SetByteArrayRegion(bytes, 0, (jsize)strlen(pat), (jbyte*)pat);
// Set up String, Save the language type , be used for byte Array conversion to String Time parameters
jstring encoding = (env)->NewStringUTF("GB2312");
// take byte Array to java String, And the output
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
stay jni Of C The above error will appear in the partial call of language , This is because in the C In a language, the function to be called must be defined in front of the calling function , Otherwise, the function cannot be found .
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
There will be the above problems of finding relevant methods , The solution is as follows :
If it is c Program , Use (*env)->
If it is C++ Use env->
ps: stay linux Next if .c Used in documents “env->” The compiler will not find this structure , Must use “(*env)->”, Or change it into .cpp file , With c++ To compile .
Here's the difference between the two :
namely C++ Use in
env->FindClass("java/lang/String")
C Use in
(*env)->FindClass(env, "java/lang/String")
边栏推荐
猜你喜欢
Ensp-nat comprehensive experiment
Kettle optimization to improve MySQL read and write speed
来自一个菜鸟的爬虫分析过程(文末附代码)
编程之路,须铸金蝉之势
安装及管理程序
Concepts de base de la langue C - petites connaissances une fois par jour
Installation and management procedures
RNA 20. SCI 文章中单样本免疫浸润分析 (ssGSEA)
目录和文件管理
Disk management and file system
随机推荐
动态路由协议—RIP实验
JS基础--this关键字的劫持
English introductory notes
DOM操作--获取元素和节点
编程之路,须铸金蝉之势
DNA 6. 基因组变异之绘制精美瀑布图(ComplexHeatmap)
C语言基本概念——每天一遍小知识
See "cocos2dx-3.0 as I understand it" in combination with the source code - memory management
北京双线机房的优缺点分析
静态路由的配置,实现全网可达
VRRP虚拟路由器冗余协议
Progress report of Tongniu machine room project
Apktool回编译问题解决方案总结
Achievement report of Tiantan computer room project
C语言程序设计技巧之字符串长度
最新UPX3.91-支持win64/PE-加/脱壳
Dynamic routing protocol OSPF comprehensive experiment
Ensp-nat comprehensive experiment
Jupyternotebook plug-in management and installation
DHCP原理与配置