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的文件夹如

android wrapper C调用java api - 示韦BadSmile - dying
然后输入javap -s WrapperJinterface 即可得到每个函数的签名(貌似是参数的签名,搞不懂),如

 

android wrapper C调用java api - 示韦BadSmile - dying
(Ljava/lang/String;)V就是我们需要的参数。
3. 调用, 在C中想要调用的位置,调用即可。如
 GotoBrowser((char*)http://blog.163.com/kingd_dy);

posted on 2010-11-25 19:09  示韦BadSmile  阅读(1529)  评论(0编辑  收藏  举报

导航