您的位置:首页 > 移动开发 > Android开发

Android_NDK_c调用java代码

2013-10-27 18:53 411 查看
本博文为子墨原创,转载请注明出处!
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完整路径>来得到方法的签名,注意包含后面的;号



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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐