android wrapper C调用java api
我表示,用wrapper不用担心无法使用android的一些特性了,因为,强大的JNI可以实现用C调用java函数,具体怎么实现呢。
举例(跳转到浏览器)
1. 打开src/com/com2us/wrapper/WrapperJinterface.java, 写你想在java中完成的功能,比如我想跳转到浏览器,参数是网址字符串,那么,
public static void GotoBrowser(String uri) { Uri myBlogUri = Uri.parse(uri); Intent it = new Intent(Intent.ACTION_VIEW, myBlogUri); activity.startActivity(it); }
至于为什么要用静态方法,其实也可以不用,只是因为不用静态方法的话,还得先实例化一下,多了几个步骤。都可以。
2. 来到jni/gamesrc/CletModule.c中,添加函数
void GotoBrowser(char* httpUrl) { extern JNIEnv* g_EnvMain; JNIEnv *env = g_EnvMain; //想要调用java的函数,env是必不可少的,相当于桥梁。 jclass classWA = (*env)->FindClass(env, "com/com2us/wrapper/WrapperJinterface"); //classWA就指向要调用的类(大家都知道java中都是以类组织的,所以想调用函数,首先要找到它所在的类) jmethodID midMain = (*env)->GetStaticMethodID(env, classWA,"GotoBrowser","(Ljava/lang/String;)V"); //找到相应的函数,最后一个参数是签名,用javap -s -p 命令拿到的,待会细说。) jstring StringArg = (*env)->NewStringUTF(env,httpUrl); //将char*的字符串转成java的String (*env)->CallStaticVoidMethod(env,classWA,midMain,StringArg); //调用此静态方法 }
3. 关于"(Ljava/lang/String;)V"是怎么得到的,研究了一下,首先javap是java的反编译工具,可以根据.class文件反编译得到想要的东西。
首先讲目录定位到放置.class的文件夹如
然后输入javap -s WrapperJinterface 即可得到每个函数的签名(貌似是参数的签名,搞不懂),如
(Ljava/lang/String;)V就是我们需要的参数。
3. 调用, 在C中想要调用的位置,调用即可。如
GotoBrowser((char*)http://blog.163.com/kingd_dy);
posted on 2010-11-25 19:09 示韦BadSmile 阅读(1532) 评论(0) 编辑 收藏 举报