Android_NDK_c调用java代码

来源:互联网 发布:淘宝网退机票 编辑:程序博客网 时间:2024/05/23 00:01
本博文为子墨原创,转载请注明出处!
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;}

原创粉丝点击