欢迎来到天天文库
浏览记录
ID:8807477
大小:42.50 KB
页数:8页
时间:2018-04-08
《ndk中调用已有的so生成新的so》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、NDK中调用已有的so生成新的so这两天,头不在,背其他开发组的老大抓去做苦力,大概任务就是,用NDK,新生成一个so来调用已有so文件中的功能。开始一头雾水,因为对NDK,写makefile不很熟悉,大概看了NDK里两个例子之后,没有提到调用已有的so,于是搜索了一下,看到一篇文章中的内容基本说明了我要做的事情,(非常感谢)http://blog.csdn.net/vrix/archive/2010/03/06/5351196.aspx最后在这篇文章的帮助下,算是完成了任务。这里记载一下,记性差。老忘事情
2、。。说明:同样对这个问题不很熟悉的同学可以看一下。希望有所帮助。比如。已有一个so文件,名为"libold.so"。其中有方法"intoldmethod()"。现在由于某些原因,接口变化,或根本不知道old.so中接口,但要用到oldmethod方法,因此,用一个新的接口,若接口为"jintJava_com_example_newmethod(JNIEnv*,jobject)"生成新的so文件,来使用。mynewlib.c文件如下:#include#include#incl
3、udejintJava_com_example_tnewmethod((JNIEnv*env,jobjectthiz){void* filehandle=dlopen("/data/data/com.example/lib/libold.so",RTLD_LAZY);//打开原so文件if(filehandle) { int(*oldmethod)(); oldmethod=dlsym(filehandle,"oldmethod");//引入原so中的函数 if(oldme
4、thod) { //调用该函数 } }}这里的dlopen和dlsym是android中/system/lib下libdl.so中的函数。因此需要把这个文件从android中导出,在模拟器中直接pull就可以了。之后在编译so时没有link到这个so,编译会失败。有了该文件后,Android.mk如下:LOCAL_PATH:=$(callmy-dir)LOCAL_MODULE:=my-new-libLOCAL_SRC_FILES:=mynewlib.c#这里l
5、ink了libdl.so,好像放在ANDROID_NDK_ROOT路径下,不对的话,看编译出错的信息也能够找到正确的路径吧LOCAL_LDLIBS:=-L.-ldlinclude$(BUILD_SHARED_LIBRARY)大致就是这样吧。由于家里没有环境,草草写这些,基本上引用的那篇文章中也写到了。很晚了~就这样吧从网上看了一篇使用andriod的toolchain在cygwin上来建立android的开发环境,但是在vista上编译始终失败,在xp上能够成功。但是编译的时间比较长,而且对于新手来说也比较
6、麻烦,难道就没有简单的方法吗?google已经把andriod的ndk已经放出来了,所以我就想着打它的主意了,把它配置一下,就能来开发c的程序了。旁边小伙肯定笑了,“搞啥?,有病啊,ndk就是一个开发nativecode的环境。”大哥,我当然知道了,虽然使用ndk来开发nativecode相对容易,但是它的.mk文件我看的是云里雾里,我本来想调用自己写的另外一个so库,都不知道在.mk文件里如何写,我现在也懒的去看ndk里面的mk文件,等哪天(哪天?天晓得是哪一天)有空了好好研究一下。好了,闲话少说,开练吧
7、。首先安装cygwin,这个网上的教程多的是,就不说了,接着下载androidndk,这个在andriod的官网上就有了,然后下载一个从android模拟器里取systemlib的工具busybox,然后调用命令$adbpushbusybox/dev/sample/busybox$adbshellchmod777/dev/sample/busybox$adbshell./dev/sample/busyboxtar-cf/dev/sample/libs.tar/system/lib$adbpull/dev/s
8、ample/libs.tarlibs.tar这样就将模拟器下的/system/lib目录的所有库(so)文件打包并下载下来了,解压libs.tar就得到了我们所需要的所有库文件。接着将所有的文件copy到$(NDK)/build/prebuilt/windows/arm-eabi-4.2.1/lib/gcc/arm-eabi/4.2.1,好了,这个时候基本的配置工作就结束了,怎么样简单多了吧。接着编写一个简单的c
此文档下载收益归作者所有