我表示,用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);

更多相关文章

  1. C语言函数的递归(上)
  2. Android跨进程通信IPC之11——Binder驱动
  3. Android(安卓)APN开发流程分析
  4. Android(安卓)线性布局(LinearLayout)相关官方文档 - 布局参数部分
  5. 浅谈Android的TabHost
  6. 如何在android app中使用STL库
  7. Android原生和H5、JS交互,使用JsBridge
  8. Android(安卓)C++多线程-创建子线程
  9. Android(安卓)Power Management

随机推荐

  1. Android含文档server结束(client UI接口异
  2. Android(安卓)后台任务(四)Loader
  3. ArcGIS for Android(安卓)在Eclipse上的
  4. Android(安卓)Studio添加字体解决方案
  5. Android(安卓)1.5 在eclipse中出现:Intern
  6. Android(安卓)Studio 入门
  7. Android开发,用C#!
  8. Android定时广播和定时服务两种实现方式
  9. Android端JQueryMobile使用教程(一)
  10. 使用Android自带DownloadManager下载文件