Android_NDK_c调用java代码

本博文为子墨原创,转载请注明出处!
http://blog.csdn.net/zimo2013/article/details/13183499

1.找到class字节码文件

jclass clazz = (*env)->FindClass(env, "com/example/ndk/MainActivity");
if(clazz == 0){ //如果该字节码文件不存在
	LOGI("error clazz");
	return;
}

2.找到Method方法

jmethodID method = (*env)->GetMethodID(env, clazz, "add","(II)I");
if(method == 0){
	LOGI("method error");
	return;
}
关于GetMethodID的第三个参数,可以利用javap -s <class完整路径>来得到方法的签名,注意包含后面的;号

Android_NDK_c调用java代码_第1张图片

3.调用相应的方法

jint result = (*env)->CallIntMethod(env,obj,method,4, 10);//第二个为操作的对象,method为调用的方法,后面为参数信息
LOGI("result = %d", result);
/*jstring barr = (jstring)(*env)->CallObjectMethod(env,obj,method);	//可以执行强转
char* charss = Jstring2CStr(env, barr);*/

4.补:将jstring转为char*

//将java语言的就string 转化为c语言中的*char类型
char* Jstring2CStr(JNIEnv* env, jstring jstr) {
	char* rtn = NULL;
	jclass clsstring = (*env)->FindClass(env, "java/lang/String");
	jstring strencode = (*env)->NewStringUTF(env, "utf-8");
	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;
}

你可能感兴趣的:(java,c,jni,NDK,jstring)