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. zabbix入门知识

    zabbix入门知识 zabbix中文手册 https://www.zabbix.com/documentation/3.4/manual/ 1.zabbix介绍 Zabbix 是一个企业级的分布式开 ...

  2. 苹果新贵 Swift 之前世今生

    摘要 : 做为一个70后程序员,克里斯先后发明了 LLVM.Clang 和 Swift,请问你做了什么?   上 周出差劳顿,这篇文章几次动笔都未完成,常常躺倒床上就昏睡过去.南方的天气闷热潮湿,让我 ...

  3. Springmvc 并发访问的线程安全性问题

    首先对于spring的IOC来说,对象是由Spring来帮我们管理,也就是在Spring启动的时候,在Spring容器中,由Spring给我们创建的,Spring会帮我们维护,一般都是单例的,也就是一 ...

  4. win7 使用anaconda安装tensorflow并且在jupyter notebook上启动

    记录一下学习深度学习的小事情: 1.tensorflow 现在只支持windows 64位系统: 2.因为实验室的电脑比较老旧,Gpu配置低,所以选择安装的是tensorflow Cpu版本,对于学习 ...

  5. intellij-项目目录隐藏无用的文件和文件夹

    File-->Editor-->File Types

  6. 数据存储之HTTP Cookie

    Cookie (HTTP Cookie) 作用 HTTP本身是无状态的,客户端通过Cookie来存储会话信息 限制 cookie在性质上是绑定在特定域名下的 意思是说当设定了一个cookie之后,再给 ...

  7. Python---socketserver

    为方便以后学习和查询,特从socketserver架构.源码分析和案例三方面进行总结 1. Python之socketserver架构 2. Python之socketserver源码分析(一) 3. ...

  8. spring使用@Cache的简单实现

    基于xml的配置感觉没有注解形式简单明了,咱不考虑了. 进入正题之前先提个疑问,希望知道的人能告诉一下 下述介绍会有这段代码: @Cacheable(value="myCache" ...

  9. 【转】Awk 命令学习总结、AWk命令系列学习(linux shell)

    前面的话 学习linux 的同人,都知道linux shell文本处理能力非常强大.有一组强大的文本处理工具:grep,sed,awk . 其中grep 经常用作查找匹配文本.sed用作文本编辑替换. ...

  10. iOS页面切换动画实现方式。

    iOS页面切换动画实现方式. 1.使用UIView animateWithDuration:animations:completion方法 Java代码 [UIView animateWithDura ...