




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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 #include #include 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就得到了我们所需要的所有库文件。接着将所有的文件copy 到 $(NDK)/build/prebuilt/windows/arm-eabi-4.2.1/lib/gcc/arm-eabi/4.2.1,好了,这个时候基本的配置工作就结束了,怎么样简单多了吧。接着编写一个简单的c文件 tutorial01.c#include int getinformation()return 0;然后编写一个Makefile文件CC = /cygdrive/f/software/android/android-ndk-1.5_r1/build/prebuilt/windows/arm-eabi-4.2.1/bin/arm-eabi-gccCFLAGS = -g -O2 -fPIC -DANDROID -I ./ -I ./ -I F:/software/android/android-ndk-1.5_r1/build/platforms/android-1.5/arch-arm/usr/includeSDFLAGS = -nostdlib -Wl,-T,armelf.xsc -Wl,-soname,$ -Wl,-shared,-Bsymbolic -lcCRT_OBJS= -lz -lmall: libtutorial01.solibtutorial01.so: tutorial01.o$(CC) $(SDFLAGS) -o $ tutorial01.o $(CRT_OBJS)tutorial01.o: tutorial01.c然后make,这个时候会报错 cant find armelf.xsc, 在ndk的目录里搜索一下,搜到之后copy 到$(NDK)/build/prebuilt/windows/arm-eabi-4.2.1/lib/gcc/arm-eabi/4.2.1,然后make,成功。这样一个简单的so文件就生成了,这个时候如果想在android的虚拟机上运行,我们还需要给它包装一下。再编写一个文件test01.c,在这里是使用dl动态加载so文件,静态加载始终有问题,搞不清楚android是如何搜索目录,而且现在只能用绝对路径,这个问题还得仔细研究研究。#include #include jintJava_com_example_testffmpeg_testffmpeg_getinformation( JNIEnv* env, jobject thiz )void* filehandle = dlopen(/data/data/com.example.test/lib/libtutorial.so, RTLD_LAZY );int ll = -1;if(filehandle)int( * getinformation ) ();getinformation = dlsym(filehandle, getinformation);if( getinformation )ll = getinformation();elsell = -3;dlclose(filehandle);filehandle=0;elsell = -2; return ll;同样再来一个Makefile文件CC = /cygdrive/f/software/android/android-ndk-1.5_r1/build/prebuilt/windows/arm-eabi-4.2.1/bin/arm-eabi-gccCFLAGS = -g -O2 -fPIC -DANDROID -I ./ -I ./ -I F:/software/android/android-ndk-1.5_r1/build/platforms/android-1.5/arch-arm/usr/includeSDFLAGS = -nostdlib -Wl,-T,armelf.xsc -Wl,-shared,-Bsymbolic -Wl,-soname,$ -lc -L ./tutorialCRT_OBJS= -lz -lm -ldlall: libtest01.solibtest01.so: test01.o$(CC) $(SDFLAGS) -o $ test01.o $(CRT_OBJS)ok, make一下成功。好了,接下来使用andriod的sdk写一个简单的activity, testapp来测试其运行情况,以下是test01.java的代码。package com.example.test;import android.app.Activity;import android.widget.TextView;import android.os.Bundle;public class test01 extends Activity /* Called when the activity is first created. */ Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); /* Create a TextView and set its content. * the text is retrieved by calling a native * function. */ TextView tv = new TextView(this); / tv.setText( stringFromJNI() ); Integer ll = getinformation(); String lls = ll.toString(); tv.setText(lls); setContentView(tv); /* A native method that is implemented by the * hello-jni native library, which is packaged * with this application. */ public native int getinformation(); /* this is used to load the hello-jni library on application * startup. The library has already been unpacked into * /data/data/com.example.HelloJni/lib/libhello-jni.so at * installation time by the package manager. */
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025福建省市场监督管理局直属事业单位招聘高层次人才20人模拟试卷附答案详解(黄金题型)
- 2025年甘肃省兰州市肺科医院招聘工作人员14人考前自测高频考点模拟试题及参考答案详解一套
- 2025年上海市城市规划设计研究院招聘高层次专业技术人员考前自测高频考点模拟试题附答案详解(突破训练)
- 2025河南中医药大学人事代理工作人员招聘13人模拟试卷及完整答案详解一套
- 2025广西玉林市北流市大伦镇便民服务中心招聘公益性岗位模拟试卷及一套参考答案详解
- 2025湖南凤凰县直机关事业单位选调40人考前自测高频考点模拟试题及答案详解(典优)
- 2025年甘肃科源电力集团有限公司高校毕业生招聘40人(第三批)考前自测高频考点模拟试题及答案详解(新)
- 2025年滨州邹平怀远学校教师模拟试卷及参考答案详解1套
- 2025湖南郴州飞天山翠江旅游景区多岗招聘考前自测高频考点模拟试题及1套完整答案详解
- 2025年铁总服务有限公司应届高校毕业生招聘考前自测高频考点模拟试题带答案详解
- 2025贵州贵阳市投资控股集团房地产置业有限公司招聘12人考试参考题库及答案解析
- 免疫细胞治疗安全性评价-第1篇-洞察及研究
- 车间师带徒管理办法
- 桥梁工程监理工作实施方案
- 2025年秋期新教材部编人教版一年级上册道德与法治教学计划+进度表
- 服装辅料基础知识培训
- 医院门诊急诊统筹管理方案
- 国家事业单位招聘2025农业农村部国际交流服务中心招聘拟聘用人员笔试历年参考题库附带答案详解
- 2025年AI技术在项目管理中的应用洞察报告
- 胃肠外科医生进修汇报
- 慢病健康宣教课件
评论
0/150
提交评论