你的位置:首页 > 操作系统

[操作系统]Android java传递string类型数据给C


本文接着实现《Android java传递int类型数据给C》的还未实现的方法:

public native String sayHelloInC(String s);

先贴一个工具方法,具体意义后面的文章将介绍

/** * 把一个jstring转换成一个c语言的char* 类型. */char* _JString2CStr(JNIEnv* env, jstring jstr) {  char* rtn = NULL;  jclass clsstring = (*env)->FindClass(env, "java/lang/String");  jstring strencode = (*env)->NewStringUTF(env, "GB2312");  jmethodID mid = (*env)->GetMethodID(env, clsstring, "getBytes",      "(Ljava/lang/String;)[B");  jbyteArray barr = (jbyteArray) (*env)->CallObjectMethod(env, jstr, mid,      strencode); // String .getByte("GB2312");  jsize alen = (*env)->GetArrayLength(env, barr);  jbyte* ba = (*env)->GetByteArrayElements(env, barr, JNI_FALSE);  if (alen > 0) {    rtn = (char*) malloc(alen + 1); //"\0"    memcpy(rtn, ba, alen);    rtn[alen] = 0;  }  (*env)->ReleaseByteArrayElements(env, barr, ba, 0);  return rtn;}

接着完成sayHelloInC函数

/* * Class:   com_wuyudong_javapassdata_JNI * Method:  sayHelloInC * Signature: (Ljava/lang/String;)Ljava/lang/String; */
JNIEXPORT jstring JNICALL Java_com_wuyudong_javapassdata_JNI_sayHelloInC( JNIEnv * env, jobject clazz, jstring jstr) { //调用工具方法把java中的string类型转换成C语言中的char× char* cstr = _JString2CStr(env, jstr); int len = strlen(cstr); int i; for (i = 0; i < len; i++) { *(cstr + i) += 1; } return (*env)->NewStringUTF(env, cstr);}

搞定,运行项目