本文接著實現《Android java傳遞int類型數據給C》的還未實現的方法: public native String sayHelloInC(String s); 先貼一個工具方法,具體意義後面的文章將介紹 接著完成sayHelloInC函數 MainActivity.java中添加下麵代碼: ...
本文接著實現《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); }
MainActivity.java中添加下麵代碼:
public void passString(View v) { Toast.makeText(getApplicationContext(), jni.sayHelloInC("hello yudong"), 0).show(); }
搞定,運行項目
獲取更多C相關知識,關註公眾號:“csuanfa”