Android下引用系统库(.so文件)的方法及问题_第1页
Android下引用系统库(.so文件)的方法及问题_第2页
Android下引用系统库(.so文件)的方法及问题_第3页
Android下引用系统库(.so文件)的方法及问题_第4页
Android下引用系统库(.so文件)的方法及问题_第5页
免费预览已结束,剩余2页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、我们看一下如何在Android环境下引用/system/lib下的.so文件(若您也对此有所了解,还望不吝赐教后面的问题,先谢为避免讲得混淆,先将我的代码的结构贴出来Andr&idJniT&st音5rc由,JAndrciellniTestActivity.j;TCaEIMative.javaaMfe&fegen.Litdt+L:-已二jAndroid2.2m砧eUbin匕二include-telephony国cit_cdma_sm&rh国ril.h&librilmoek-rilreferEnce-nl&riId.秒Andraid.mkl_cjma

2、rsccm-CallNativc.h国testx包Hbt日amneabipr;libtest,so&objfe®旦AndroidManifest.xmlQguwd.cfg凿project,propertiesThninflrnid-JImiTcrtH首先,新建Android工程:AndroidJniTest,在AndroidJniTestActivity.java中的代码如下:javaviewplaincopyprint?1. ;2. importandroid.app.Activity;3. importandroid.os.Bundle;4. publicclassAnd

3、roidJniTestActivityextendsActivity5. /*Calledwhentheactivityisfirstcreated.*/6. Override7. publicvoidonCreate(BundlesavedInstanceState)8. super.onCreate(savedInstanceState);9. setContentView(R.layout.main);10. System.loadLibrary("test");11. CallNativecallnative=newCallNative();12. bytecmd=

4、(byte)'u004c'13. inta=callnative.writeCmd(cmd,"/system/lib");14.15. 16. ;importandroid.app.Activity;importandroid.os.Bundle;publicclassAndroidJniTestActivityextendsActivity/*Calledwhentheactivityisfirstcreated.*/OverridepublicvoidonCreate(BundlesavedInstanceState)super.onCreate(sav

5、edInstanceState);setContentView(R.layout.main);System.loadLibrary("test");CallNativecallnative=newCallNative();bytecmd=(byte)'u004c'inta=callnative.writeCmd(cmd,"/system/lib");再在包下建立文件:CallNative.java代码:javaviewplaincopyprint?1. ;2. publicclassCallNative3. publicnativebyt

6、ereadCmd(Stringpath);4. publicnativeintwriteCmd(bytecmd,Stringpath);5. ;publicclassCallNativepublicnativebytereadCmd(Stringpath);publicnativeintwriteCmd(bytecmd,Stringpath);利用javah工具创建本地库文件的头文件mars_com_CallNative.h代码:cppviewplaincopyprint?1. /*DONOTEDITTHISFILE-itismachinegenerated*/2. #include<j

7、ni.h>3. /*Headerforclassmars_com_CallNative*/4. #ifndef_Included_mars_com_CallNative5. #define_Included_mars_com_CallNative6. #ifdef_cplusplus7. extern"C"8. #endif9. /*10. *Class:mars_com_CallNative11. *Method:readCmd12. *Signature:(Ljava/lang/String;)B13. */14. JNIEXPORTjbyteArrayJNICA

8、LLJava_mars_com_CallNative_readCmd15. (JNIEnv*,jobject,jstring);16. /*17. *Class:mars_com_CallNative18. *Method:writeCmd19. *Signature:(BLjava/lang/String;)I20. */21. JNIEXPORTjintJNICALLJava_mars_com_CallNative_writeCmd22. (JNIEnv*,jobject,jbyteArray,jstring);23. #ifdef_cplusplus24. 25. #endif26. #

9、endif/*DONOTEDITTHISFILE-itismachinegenerated*/#include<jni.h>/*Headerforclassmars_com_CallNative*/#ifndef_Included_mars_com_CallNative#define_Included_mars_com_CallNative#ifdef_cplusplusextern"C"#endif/*Class:mars_com_CallNative*Method:readCmd*Signature:(Ljava/lang/String;)B*/JNIEXP

10、ORTjbyteArrayJNICALLJava_mars_com_CallNative_readCmd(JNIEnv*,jobject,jstring);/*Class:mars_com_CallNative*Method:writeCmd*Signature:(BLjava/lang/String;)I*/JNIEXPORTjintJNICALLJava_mars_com_CallNative_writeCmd(JNIEnv*,jobject,jbyteArray,jstring);#ifdef_cplusplus#endif#endifcppviewplaincopyprint?1.&l

11、t;pre><pre>javaviewplaincopyprint?1.<preclass="cpp"name="code"><pre><preclass="cpp"name="code"><pre>至于如何生成此头文件,可自行学习,这里不多讲了第二,在工程目录下建立文件夹:jni,将文件mars_com_CallNative.h拷贝到此目录下,再在此目录下建立文件test.c代码:#include"mars_com_CallNative.

12、h"#include<jni.h>#include<stdio.h>#include<string.h>#include<assert.h>#include<android/log.h>#include<dlfcn.h>#include<unistd.h>#include<sys/types.h>#include"include/telephony/ril.h"#defineLOGD()_android_log_print(ANDROID_LOG_DEBUG,"

13、;keymatch",_VA_ARGS_)JNIEXPORTjbyteArrayJNICALLJava_mars_com_CallNative_readCmd(JNIEnv*evn,jobjectobj,jstringjstr)exit(0);JNIEXPORTjintJNICALLJava_mars_com_CallNative_writeCmd(JNIEnv*evn,jobjectjobj,jbyteArrayjba,jstringjstr)return56;jintJNI_OnLoad(JavaVM*vm,void*reserved)LOGD("JNIONLOADsu

14、ccess!");char*path="/system/lib/libril.so"void*filehandle0=dlopen(path,RTLD_LAZY|RTLD_GLOBAL);/引用path指向的库:/system/lib/libril.sochar*ll;intpid;if(filehandle0)LOGD("opensosuccess!");char*(*requesttostring)(int);if(0=pid)sleep(1);/子进程睡眠一秒requesttostring=(char*(*)(int)dlsym(file

15、handle0,"requestToString");pid=fork();if(requesttostring)LOGD("callfunctionrequesttostringOK!");ll=requesttostring(RIL_REQUEST_GET_NEIGHBORING_CELL_IDS);RIL_REQUEST_GET_NEIGHBORING_CELL_IDS定义在include/telephony/ril.h中LOGD("thevalueofrequesttostringis%s",*ll);elseLOGD(&qu

16、ot;callfunctiongetinformation!ERROR!");LOGD("ok");elseif(0<pid)LOGD("intheparent%s'n",getpid();elseLOGD("forkerror");将Android源码hardware/ril下的include文件夹也拷贝到jni文件夹下(因为在requesttostring(RIL_REQUEST_GET_NEIGHBORING_CELL_IDS)中使用的RIL_REQUEST_GET_NEIGHBORING_CELL_ID

17、S在include文件夹下的ril.h中定义了)在jni文件夹下新建Android.mk文件,内容如下:plainviewplaincopyprint?1. LOCAL_PATH:=$(callmy-dir)2. include$(CLEAR_VARS)3. LOCAL_MODULE:=test4. LOCAL_SRC_FILES:=test.c5. LOCAL_LDLIBS:=-llog6. LOCAL_CERTIFICATE:=platform7. include$(BUILD_SHARED_LIBRARY)LOCAL_PATH:=$(callmy-dir)include$(CLEAR_V

18、ARS)LOCAL_MODULE:=testLOCAL_SRC_FILES:=test.cLOCAL_LDLIBS:=-llogLOCAL_CERTIFICATE:=platforminclude$(BUILD_SHARED_LIBRARY)第三,接下来就是编译的时候了。在cygwin下$ndk/ndk-build卅$ndk/nd!tJbuildGompllatliumb=test<=testSJiaredLibrarji;lil)tcst,soInstall:lihtestiso=>libe/apmeahi/libtest.so显示编译通过了,F5刷新工程,发现在工程目录下多了一

19、下文件夹:libs,其中就包含了生成的文件:libtest.so最后,运行。发现在Logcat下有这些信息:Trnep©AppJisyrtipnT叼"dt33<335:33:4;,f-OL皿士二:业ktITEBUTE:&tLKh:fthreadT5ioderThreadI31failedM-1325d3:4*.337郎cfara.30£dalvifcT:tiding1cj.lLit-daa-da-a,iran,zge/life,libtez*j3£«IjiH'fei£SSzQ3-1?05:31:4.337439M

20、I9.Z0Lda.vusrADlzZlcMTSZlit二寸E.狙二3.二H_1二:LtitiSt.m。'.I4e2EZjJ3-1305:33;l7jr139际九犯tEyialch皿I超口汇M二M曰!3311QfrnilT.TT酬曜北.“工Ikisutdh型券ka'jcccai"oa-u05:u:4£.m9出邈u±ulircitticirtqi:*flt:.csc£jM:03-1105:33:蛾跑03-1355:33:473以9le;Tat2tcallfciDtdCLrexzttDstriLj总!31Q3-U06:封:tt:.m3jDEEK

21、Etaild:iL3er;run:1gEDoic/idk/fsneric即皿91b"E:eogte=z-ttjf103-19G5:U:4L72731二EG雷pil:4W,忖上439»>as:*,:x«<第-110S±13:41.71731EEEDC六声二11|£I:SE?;iiPfaultC:200i:r03-13'5:33:,.737ILJ(K二乂丁工:-:-128nK3D13DCJDCZ0M335:33:4:,73731:'EE7?Mmfffifr5UK我Zre«£1D254r5C30C:20

22、03-1931DEEDSrE301300r9OCOOccto:IDilJcMSe邙DC300:00JJ-HQ5:U:«J3T31ZEEU5LI式曰,尤:耀«5xL.:._±.J*.icC;5£.JIJ.1Ln<-0S:33:tt.E5731而E明匚甘士三三3Y3:EL-lli;'13hc.SD03-1335:33:463731WEEKMl际口二巾限斫尔:加1必田03-L3Q5:33iUaE9E31nEOE和I阳口门底旗。/syj:a/iw/ii£c+35J-1S35J3:4;,S383:叫ee|网解工箱:.,m0二皿以出:品配n-

23、ia咏删蛇数?31二dt。&ecfIiata.'zHta/iiiisrr,.111-.2:J3-1SJ5:33:4:.S-JT孑DEKE和15pcL2J42tl:"3yJ3EB/.llXii,iltxr-Tl.SC03-105;J3;tt,fr31EE79f0C5t,:3S3y3:K,lJj/:;tcn.3CQS-U峰:3:二墨重FTg0:l:nUggfWL加'35:33:41.91711:和1卜一二:_L,;U二,3l注二注3三:亚.算f11困H)9pcd或第:Lsc03-1305:33:tt.m幻2EEJ3fclCpeENG:E三ayrzra'li

24、h,111ibri.ac0J-138门3:4队KTZEE7SQLpC口力辽噬工,弹工门空F11W3U割G3-L906:33:«rDOOOOOt:2pc£:lietl4SYCttH.-'iJsc.atIOMi眦虺5Lb412033beBUMIO:D;:;OJI阵小曲昭显.81111_1Z.rbtflMM帆捌BQ卜盟N;眦$1削,fl:娴ICfl-15的眦5LMT31TMG星汇正兼灯,二工:二一止二:二2OJ-1506:0J!52.0r髓瓦:7H睽*慰?em«!bh+uiipid1bidied-I(13-H岫眦峪.谢ffyf:!ajTCK3!飞卿电讨式RJJI

25、E:fRL刑util*1X&WXE!:J<:0£I03r13g§;06;5£JQ?寸斜Fna4/"*白事:iiTPTni:邛:OH%Ol:«iwjrCt附如电州,驰上,.ummMJSLirnftttl1!7JUSN址1果”3(IMS>0空凡涯出CLHT3Irfi:-r«dN7也芳,口:1MX匕七弟itE?喈:OJ-1:g匚跖图馨fy:;Esjr:K!j女工豺匚能":*上":1门;JT%湍:,";1式汉3丹:小;七:注:?酢:4G:;H=7好了,问题来了。问题一、从绿色部分的内容来看,应该是成功引用了/system/lib/libril.so的,但为什么在上面只输出了TimePIDApplicctiGnTag7erf:C0-13053:15.477UU7E:a?aAat£"

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论