大家好,
 请问,有谁用NDK编译开源库并用Android App(java)调用测试过的?网上关于这方面的资料好少,都是分析那几个sample。NDK本身目的就是为了使用开源库的,但是很难找到这方面的资料。要么就是只能找到如何编译得到so的。有谁有这方面的经验?我现在试着编译了几个开源库,基本都失败了。现在jpeg编译得到了so,但是调用也是失败。NDK的资料真的很难找啊!求助。
谢谢。

解决方案 »

  1.   

    晕,估计你基础没学好吧,ndk就一个c++编译器,重在c项目的代码掌握
      

  2.   

    谢谢你的回复。我想你没理解我的问题,我现在用ndk得到了so文件,但是在Java源文件调用失败。我想知道有没有人做过完成的在Java/Android中调用由NDK得到开源库的so的经历网上几乎没有这样的例子。你有试过编译一个开源库并测试没?比如编译ffmpeg,libjpeg等?谢谢。
    P.S:NDK不是一个c++编译器,NDK是提供了一些工具而已,包含了交叉编译链,使用的是arm-gcc来编译链接。
      

  3.   

    貌似你应该学习啊JNI,三层打通,JNI是关键
      

  4.   

    恩,JNI是关键。我只是想测试一下调用开源库。我知道JNI怎么写。那些sample我可以跑通。我现在具体就是我编译libjpeg,得到了so,用方法调,也是可以的。但是我调用某些函数程序运行崩溃。直接看下面的代码吧:
    int Java_com_hello_jpeg_JpegActivity_foo(JNIEnv* env, jobject thiz)
    {
    char* filename = "/mnt/sdcard/test.jpg";

    FILE * infile;
    struct jpeg_decompress_struct cinfo;
    if ((infile = fopen(filename, "rb")) == NULL) {
    //     fprintf(stderr, "can't open %s\n", filename);
    return -1;
       }  jpeg_create_decompress(&cinfo);
    jpeg_stdio_src(&cinfo, infile);
    (void) jpeg_read_header(&cinfo, TRUE);
            ....
    注释掉(void) jpeg_read_header(&cinfo, TRUE);就可以运行,说明不是JNI的写法什么的问题。加上之后运行崩溃。具体说吧,就是一堆的logcat,网上有很多类似的,“signal 11 (SIGSEGV), fault addr 00000000“,从搜索的来看,都是跟内存资源有关。但是网上的那些都是很简单的情况,比如把C里面的指针返回给Java等引起的,没找到使用开源库的例子。
    谁有使用开源库的经验没有啊?个人觉得很多第三方库都会涉及到内存分配,我怀疑是跟Android虚拟机和内存分配之间的问题。但是,NDK本身就是为了重用开源库,如果这个问题都搞不定,那还有什么用?莫非就是用来写那几个sample的。。
    强调一下我问的重点,不是如何使用NDK工具,也不是如何写JNI,而是使用NDK结合开源库在Android中使用。谢谢。我知道这方面经验的人实在是少(网上资料甚少)还是希望能运气好遇到高手。
      

  5.   

    我也苦恼中,如果可以的话,再把加载开源so库的数量限制 突破。OpenOffice可以跑在Android上了。
      

  6.   

    http://blog.chinaunix.net/space.php?uid=8272118&do=blog&cuid=1998532
    楼主看下上面的做法一般开源项目都会说本项目的编译方法的吧
      

  7.   

    谢谢。你这个链接是JNI的很基本的用法,这个我会。开源项目有自己的编译方法,但是一般都是针对win/Linux下的编译方法,他们有自己的工具链。我现在想把这个移植到Android上,相当于交叉编译了(通过NDK,跟普通的交叉编译不一样)。但是要用Android去调用(这个应该是NDK存在的意义了),网上的例子要么就是分析了如何得到so,要么就是直接移植到Android上但是不是用JNI去调用。
    谁有实际的使用开源库在Android的经验,随便什么库,ffmpeg,libjpeg,libpng都行。我现在又编译了一下zlib(这个库android自带,但是我还是自己编译试试了),编译成功。调用getversion的函数也正确了。但是上面那个libjpeg真正使用就有问题,我怀疑跟内存的东西有关。我很想知道,这些开源库到底能不能实际在Android中用。
      

  8.   

    我编译出来的ffmpeg有问题,so有问题正在修改中...
      

  9.   

    在Stackoverflow上搜到一个,希望对你有帮助,地址是http://stackoverflow.com/questions/4725773/ffmpeg-on-android下面是被采纳的答案:Here are the steps I went through in getting ffmpeg to work on Android:    Build static libraries of ffmpeg for Android. This was achieved by building olvaffe's ffmpeg android port (libffmpeg) using the Android Build System. Simply place the sources under /external and make away. You'll need to extract bionic(libc) and zlib(libz) from the Android build as well, as ffmpeg libraries depend on them.    Create a dynamic library wrapping ffmpeg functionality using the Android NDK. There's a lot of documentation out there on how to work with the NDK. Basically you'll need to write some C/C++ code to export the functionality you need out of ffmpeg into a library java can interact with through JNI. The NDK allows you to easily link against the static libraries you've generated in step 1, just add a line similar to this to Android.mk: LOCAL_STATIC_LIBRARIES := libavcodec libavformat libavutil libc libz    Use the ffmpeg-wrapping dynamic library from your java sources. There's enough documentation on JNI out there, you should be fine.Regarding using ffmpeg for playback, there are many examples (the ffmpeg binary itself is a good example), here's a basic tutorial. The best documentation can be found in the headers.Good luck :)
      

  10.   

    无论如何,先谢谢。不过你这个是讲大概如何弄这个的,这个俺会。俺现在编译libpng并用它生产png图片成功了。刚开始也遇到了我使用libjpeg时一样的问题“signal 11 (SIGSEGV), fault addr 00000000”,后来发现居然错误是由于fopen都没成功,经过研究解决了,成功用libpng生成一张png图片。
    我相信jpeg的问题也是一样的,有时间我再回头去测试libjpeg,相信可以搞定,至于ffmpeg,也会去测试一下的。
    谢谢大家的回复!
    结贴!
      

  11.   

    lz 你不够厚道。你把你的Android.mk文件贴出来啊。
    我是生成了libpng.so文件了但是我不晓得为什么连接这个so文件总是连接不上。
      

  12.   

    我已经说明了我遇到的问题,我的问题是fopen失败,后来证实为其实是因为我在java这边没有打开SD卡的读取权限。另外关于你的问题,“我是生成了libpng.so文件了但是我不晓得为什么连接这个so文件总是连接不上。”,如果.so已经生成,就和.mk文件没有任何关系,这也是我为什么没有贴.mk的原因,一个和.mk没有关系的问题我没必要贴.mk嘛。呵呵。(ps:我现在也找不到.so给你了)我觉得我已经很厚道了,我结贴前特意说明了一下我遇到的问题的原因是什么。
      

  13.   

    我遇到类似的问题,在编译openssl库的时候编译通过,生成了so,但是在程序中加载的时候出现了崩溃的现象,提示说cannot locate “函数”,我看了一下源代码,里面这个函数是存在的,有定义也有声明,但就是调用不了,有没有人解决过类似的错误的,能不能提供一下解决经验