赌圣绮梦是谁:android wrapper C调用java api - 示韦BadSmile的日志 - 网易博客
来源:百度文库 编辑:九乡新闻网 时间:2024/10/04 03:46:41
android wrapper C调用java api
Android学习2010-11-25 19:08:31阅读83评论0 字号:大中小 订阅
我表示,用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* httpUri)
{
extern JNIEnv* g_EnvMain;
JNIEnv *env = g_EnvMain; //想要调用java的函数,env是必不可少的,相当于桥梁。
jclassclassWA = (*env)->FindClass(env,"com/com2us/wrapper/WrapperJinterface"); //classWA就指向要调用的类(大家都知道java中都是以类组织的,所以想调用函数,首先要找到它所在的类)
jmethodIDmidMain = (*env)->GetStaticMethodID(env,classWA,"GotoBrowser","(Ljava/lang/String;)V"); //找到相应的函数,最后一个参数是签名,用javap -s -p 命令拿到的,待会细说。)
jstring StringArg = (*env)->NewStringUTF(env,httpUri); //将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");