NDK中调用已有的so生成新的so

上传人:夏** 文档编号:402339678 上传时间:2023-08-17 格式:DOC 页数:8 大小:22.50KB
返回 下载 相关 举报
NDK中调用已有的so生成新的so_第1页
第1页 / 共8页
NDK中调用已有的so生成新的so_第2页
第2页 / 共8页
NDK中调用已有的so生成新的so_第3页
第3页 / 共8页
NDK中调用已有的so生成新的so_第4页
第4页 / 共8页
NDK中调用已有的so生成新的so_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《NDK中调用已有的so生成新的so》由会员分享,可在线阅读,更多相关《NDK中调用已有的so生成新的so(8页珍藏版)》请在金锄头文库上搜索。

1、NDK中调用已有的so生成新的so 2010/03/06/5351196.aspx 最后在这篇文章的帮助下,算是完成了任务。这里记载一下,记性差。老忘事情。 说明:同样对这个问题不很熟悉的同学可以看一下。希望有所帮助。 比如。已有一个so文件,名为libold.so。其中有方法int oldmethod()。 现在由于某些原因,接口变化,或根本不知道old.so中接口,但要用到oldmethod方法,因此,用一个新的接口,若接口为jint Java_com_example_newmethod( JNIEnv*,jobject) 生成新的so文件,来使用。 mynewlib.c文件如下: #in

2、clude #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是

3、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 incl

4、ude $(BUILD_SHARED_LIBRARY) 大致就是这样吧。由于家里没有环境,草草写这些,基本上引用的那篇文章中也写到了。 很晚了就这样吧从网上看了一篇使用andriod的toolchain在cygwin上来建立android的开发环境,但是在vista上编译始终失败,在xp上能够成功。但是编译的时间比较长,而且对于新手来说也比较麻烦,难道就没有简单的方法吗?google已经把andriod的ndk已经放出来了,所以我就想着打它的主意了,把它配置一下,就能来开发c的程序了。旁边小伙肯定笑了,“搞啥?,有病啊,ndk就是一个开发native code的环境。”大哥,我当然知道了,虽然

5、使用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

6、/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-/lib/gcc/arm-eabi/4.2.1,好了,这个时候基本的配置工作就结束了,怎么样简单多了吧

7、。接着编写一个简单的c文件 tutorial01.c#include int getinformation()return 0;然后编写一个Makefile文件CC = /cygdrive/f/software/android/android-ndk-1.5_r1/build/prebuilt/windows/arm-eabi-/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

8、-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)

9、/build/prebuilt/windows/arm-eabi-/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, jobje

10、ct 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; r

11、eturn ll;同样再来一个Makefile文件CC = /cygdrive/f/software/android/android-ndk-1.5_r1/build/prebuilt/windows/arm-eabi-/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 -

12、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 an

13、droid.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 calli

14、ng 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 alre

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 试题/考题 > 初中试题/考题

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号