基本上jni的数据和方法都差不多放这里了,你就可以随便开发了。这个你也可以去看
jni完全手册
字符数组与jbyteArray
int byteSize = (int) env->GetArrayLength(jbyteArrayData); unsigned char* data = new unsigned char[byteSize + 1]; env->GetByteArrayRegion(jbyteArrayData, 0, byteSize, reinterpret_cast(data)); data[byteSize] = '\0'; jbyte *jb = (jbyte*) data; //data是字符数组类型 jbyteArray jarray = env->NewByteArray(byteSize); //byteSize是字符数组大小 env->SetByteArrayRegion(jarray, 0, byteSize, jb);字符数组与jstring
char* JstringToChar(JNIEnv* env, jstring jstr) { if(jstr == NULL) { return NULL; } char* rtn = NULL; jclass clsstring = env->FindClass(); jstring strencode = env->NewStringUTF(); jmethodID mid = env->GetMethodID(clsstring, , ); 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); memcpy(rtn, ba, alen); rtn[alen] = 0; } env->ReleaseByteArrayElements(barr, ba, 0); return rtn; } jstring StrtoJstring(JNIEnv* env, const char* pat) { jclass strClass = env->FindClass(); jmethodID ctorID = env->GetMethodID(strClass, , ); jbyteArray bytes = env->NewByteArray(strlen(pat)); env->SetByteArrayRegion(bytes, 0, strlen(pat), (jbyte*)pat); jstring encoding = env->NewStringUTF(); return (jstring)env->NewObject(strClass, ctorID, bytes, encoding); }特么最简单的可以直接使用
jstring jstr = env->NewStringUTF(str);jint与int的互转都可以直接使用强转,如:
jint i = (jint) 1024;上面的代码你看见了吗,都是env的一级指针来做的,所以是cpp的使用方法,如果你要转成c的那么就把env替换为(*env)好了,具体的方法可能有点小改动(请自行去参考jni手册),报错的地方请自行引入相关的.h文件,估计对你了解jni有更深的了解。
总结本篇主要介绍了JNI动态注册native方法,并且顺便截了几个jni的图,以及使用的基本数据转换处理,至于实际应用中比如java 调用c,c调用java以及混合调用等我们都需要实践中去处理问题。