- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
NDK中调用已有的so生成新的so
NDK中调用已有的so生成新的so
这两天,头不在,背其他开发组的老大抓去做苦力,大概任务就是,用NDK,新生成一个so来调用已有so文件中的功能。 开始一头雾水,因为对NDK,写makefile不很熟悉,大概看了NDK里两个例子之后,没有提到调用已有的so,于是搜索了一下,看到一篇文章中的内容基本说明了我要做的事情,(非常感谢) /vrix/archive/2010/03/06/5351196.aspx 最后在这篇文章的帮助下,算是完成了任务。这里记载一下,记性差。老忘事情。。 说明:同样对这个问题不很熟悉的同学可以看一下。希望有所帮助。 比如。已有一个so文件,名为libold.so。其中有方法int oldmethod()。 现在由于某些原因,接口变化,或根本不知道old.so中接口,但要用到oldmethod方法,因此,用一个新的接口,若接口为jint Java_com_example_newmethod( JNIEnv*,jobject) 生成新的so文件,来使用。 mynewlib.c文件如下: #include string.h #include jni.h #include dlfcn.h jint Java_com_example_tnewmethod(( JNIEnv* env, jobject thiz ) { void*? filehandle = dlopen(/data/data/com.example/lib/libold.so, RTLD_LAZY ); // 打开原so文件 if(filehandle) ??? { ??? int( * oldmethod) (); ??? oldmethod= dlsym(filehandle, oldmethod); //引入原so中的函数 ??? if( oldmethod) ??????? { ??????????? //调用该函数 ??????? } ??? } } 这里的dlopen和dlsym是android中/system/lib下libdl.so中的函数。因此需要把这个文件从android中导出,在模拟器中直接pull就可以了。之后在编译so时没有link到这个so,编译会失败。有了该文件后,Android.mk如下: LOCAL_PATH := $(call my-dir) LOCAL_MODULE := my-new-lib LOCAL_SRC_FILES := mynewlib.c # 这里link了libdl.so,好像放在ANDROID_NDK_ROOT路径下,不对的话,看编译出错的信息也能够找到正确的路径吧 LOCAL_LDLIBS := -L . -ldl include $(BUILD_SHARED_LIBRARY) 大致就是这样吧。由于家里没有环境,草草写这些,基本上引用的那篇文章中也写到了。 很晚了~就这样吧从网上看了一篇使用andriod的toolchain在cygwin上来建立android的开发环境,但是在vista上编译始终失败,在xp上能够成功。但是编译的时间比较长,而且对于新手来说也比较麻烦,难道就没有简单的方法吗?google已经把andriod的ndk已经放出来了,所以我就想着打它的主意了,把它配置一下,就能来开发c的程序了。旁边小伙肯定笑了,“搞啥?,有病啊,ndk就是一个开发native code的环境。”大哥,我当然知道了,虽然使用ndk来开发native code相对容易,但是它的.mk文件我看的是云里雾里,我本来想调用自己写的另外一个so库,都不知道在.mk文件里如何写,我现在也懒的去看ndk里面的mk文件,等哪天(哪天?天晓得是哪一天)有空了好好研究一下。好了,闲话少说,开练吧。首先安装cygwin,这个网上的教程多的是,就不说了,接着下载android ndk,这个在andriod的官网上就有了,然后下载一个从android模拟器里取system lib的工具busybox,然后调用命令
$adb push busybox /dev/sample/busybox
$adb shell chmod 777 /dev/sample/busybox
$adb shell ./dev/sample/busybox tar -cf /dev/sample/libs.tar /system/lib
$adb pull /dev/sample/libs.tar libs.tar
这样就将模拟器下的 /system/lib 目录的所有库(so)文件打包并下载下来了,解压libs.tar就得到了我们所需要的所有库文件。
接着将
文档评论(0)