levmar是一个强大的和高效率的C/C++库,采用Levenberg - 马奎德(LM)优化算法,
主要是为了解决非线性最小二乘问题。官网是:http://users.ics.forth.gr/~lourakis/levmar/
 
在PC引用,网上有挺多的资料可以查询到,但我想应用到Android上来,google了一下,找不到太多资料,只有一个国外几年前的项目:https://github.com/3deggi/levmar-ndk
 
     因为项目太久远,还是采用 eclipse IDE来开发的,我尝试搬到 Android Studio 来编译,还是编译不成功,最后只有重新配置eclipse 环境。最重要是,还得使用比较旧版本的NDK来编译,我选用的NDK版本是 12b。过程中有些小错误,我就稍微调整了一下,然后按eclipse NDK的步骤编译了一遍。
 
项目中 的 application.mk 里有一项配置:
APP_ABI := armeab
这个是CPU 的指令集配置。一般我们在编译的时候,都会兼容多种CPU,于是改为:
APP_ABI := all
 
编译中,没有什么大问题,有部分警告而已,编译成功。
编译成功后,在libs目录下出现了 arm64-v8a、armeabi、armeabi-v7a、mips、mips64、x86、x86_64 指令集目录。于是,我就用真机测试一下,有部分手机通过了,有部分手机运行出错。
 
各种调试之后,我发现可能是不同手机的CPU 支持的指令集不一样,于是我通过以下代码输出每台手机的指令集:
 String[] abis = new String[]{};
abis = Build.SUPPORTED_ABIS;
 
得到结果如下:
魅族 note2:
 
vivo Y51A
 
oppo r9s:
arm64-v8a,
armeabi-v7a,
armeabi,
 
当时vivo Y51A 能运行通过,而其他两台手机运行时会崩溃。然后我猜可能 是arm64-v8a 库出错了。于是我把这个文件以及里面的文件给删了, 果然,全部手机都运行通过了。
 
从这里大概知道:APP在获取动态库时,首先会根据CPU支持的指令集获取第一个目录下的动态库,如果获取不到,就会到下一个支持的指令集目录获取,以此类推。
 
当然这个项目算是编译成功了,因为目前多数手机的CPU都会支持 armeabi-v7a 和 armeabi。但我们也知道很多第三方的库都会兼容 arm64-v8a 这种指令集,这个64位的指令集应该会跑得更快。
 
我也尝试去重新编译 levmar 库,让它兼容 arm64-v8a 指令集。 我下载了其它版本的 NDK来尝试,因为 ndk-build 命令在 r13 中默认使用 Clang,他们将在后续版本中移除 GCC。levmar 库其实也使用到了一些 matlab 等其它语言库,我担心是这方面编译出错了。当我使用了其它版本的NDK编译后,编译是成功了,但是在 JNI 调用的时候就会报这样的错误:
 
06-22 16:32:40.741: A/libc(5024): Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 5024 (hvrl.levmar)
 
查了一下,这个错误的原因是,查不到相应 JNI 的实现方法,或者是 native 的代码执行时出错了。因为获取不到C/C++ 的错误日志,我也只能暂时放弃兼容 arm64-v8a 指令集。
 
levmar库是编译成功了,是一个 levmar.a 静态库, 这里 levmar 也使用到了 clapack,也编译成了 .a静态库。 
 
我已经编译好的项目链接:https://pan.baidu.com/s/1pLPV4oV
欢迎大家关注我,或一起讨论。
 

levmar ndk 编译的更多相关文章

  1. 使用ndk编译c可执行程序

    1.创建工程目录  在ubuntu系统下搭建好ndk编译环境,创建test目录 mkdir test 在test目录下创建jni目录 cd test mkdir jni 2.编写源代码 vim hel ...

  2. Android APP使用NDK编译后的ffmpeg库出现undefined reference to 'posix_memalign'错误

    在android程序中使用NDK编译后的ffmpeg库的时候出现了如下错误: jni/libs/libavutil.a(mem.o): in function av_malloc:libavutil/ ...

  3. Linux下NDK编译FFMPEG包含neon参数

    FFMPEG编译成Android库已经有很多案例了,编译优化neon的也很多,以下是我通过实践成功的案例,这里主要讲编译的配置文件,其他设置可结合Linux下使用NDK编译FFMPEG(libstag ...

  4. Linux下使用NDK编译FFMPEG(libstagefright)

    这个月要负责一个项目,使用FFMPEG渲染视频,主要是Android端的,由于性能要求,要使用硬解码,但网上大多数教程都是没有libstagefright的,所以个人觉得,生成的so库文件也是没有开启 ...

  5. Android Studio 中关于NDK编译及jni header生成的问题

    之前由于工作原因使用grails这个基于groovy的框架做项目,对groovy感觉很好. 基于groovy的gradle构建系统对我而言自然也是好的没得说. Android Studio 正式版出来 ...

  6. [原]如何用Android NDK编译FFmpeg

    我们知道在Ubuntu下直接编译FFmpeg是很简单的,主要是先执行./configure,接着执行make命令来编译,完了紧接着执行make install执行安装.那么如何使用Android的ND ...

  7. ffmpeg2.2在ubuntu下使用NDK编译——并在android工程下测试使用

    作者:wainiwann 出处:http://www.cnblogs.com/wainiwann/ 本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...

  8. android开发 NDK 编译和使用静态库、动态库 (转)

    在eclipse工程目录下建立一个jni的文件夹 在jni文件夹中建立Android.mk和Application.mk文件 Android.mk文件: Android提供的一种makefile文件, ...

  9. Windows下配置cygwin和ndk编译环境

    cygwin安装 正确的安装步骤其实很简单:1. 下载setup-86_64.exe 2. 直接从网上下载安装,选择包时,顶部选择“default”不变 3. 搜索make,勾选make,cmake, ...

随机推荐

  1. 数据库 MySQL进阶之索引

    数据库的索引非常重要,基本面试数据库的问题都在索引上,所以这里小编整理出来,一方面为了自己复习,一方面也方便大家. 一,索引前传 在了解数据库索引之前,首先有必要了解一下数据库索引的数据结构基础,那么 ...

  2. Insert Sort Singly List

    对单链表插入排序,给出个单链表的head节点:返回排完序的head节点: 首先数据结构中习惯了以数组为参数排序,瞬间想到是遍历单链表存入arraylist中,再进行insert sort,(O(n** ...

  3. forward和redirect

    Forward和Redirect代表了两种请求转发方式:直接转发和间接转发. 直接转发方式(Forward),客户端和浏览器只发出一次请求,Servlet.HTML.JSP或其它信息资源,由第二个信息 ...

  4. 微信小程序实现顶部、底部联动滑动

    这个场景一般用于展示数据时,数据过多,每条一行显示不下,表头可以横向滑动,下面要显示的数据部分横向纵向都可以滑动.表头或下面数据部分横向滑动的时候,两部分可以进行联动 具体效果像这样(随便写的丑样式布 ...

  5. Redis 2种持久化模式的缺陷

    http://blog.csdn.net/hexieshangwang/article/details/47254087 一.RDB持久化模式缺陷 1.问题描述: 并发200路,模拟不断写Redis, ...

  6. JVM-触发Full GC的情况

    除直接调用System.gc外,触发Full GC执行的情况有如下四种: 1.老年代空间不足 老年代空间只有在新生代对象转入及创建为大对象.大数组时才会出现不足现象,当执行Full GC后空间仍然不足 ...

  7. ProgressDialog的使用及逻辑处理

    一般用的情况先声明一个ProgressDialog progressShow = true;(用来判断用户是否点击了取消键) final ProgressDialog pd = new Progres ...

  8. PHP中文网上的分页代码

    page.php <html> <head> <meta http-equiv="CONTENT-TYPE" content="text/h ...

  9. MUI 页面传值,因为用的是H5+ plus方法所以要在真机上才能测试出效果

    页面a.html <!doctype html> <html> <head> <meta charset="UTF-8"> < ...

  10. java类加载时执行顺序

    源代码 class HelloA { public HelloA() { System.out.print("A"); } { System.out.print("B&q ...