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")