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. DALI 2.0解码模块

    DALI2.0调光解码模块使用手册 一.概述(联系人:张先生,电话:13923882807,QQ:813267849) 欢迎使用本公司的DALI 2.0解码模块,该模块支持"DALI第二套协 ...

  2. mysql中能够使用索引的典型场景

    mysql 演示数据库:http://downloads.mysql.com/docs/sakila-db.zip 匹配全值 explain select * from rental where re ...

  3. 1.JavaScript 教程:基础语法

    简介: JavaScript web 开发人员必须学习的 3 门语言中的一门: HTML 定义了网页的内容 CSS 描述了网页的布局 JavaScript 网页的行为 用法: (1)HTML 中的脚本 ...

  4. 如何通过命令或脚本方式在Windows上访问linux系统

    很多情况下,我们需要在Windows上写脚本,创建计划任务程序,这个过程中可能需要访问linux系统,执行脚本或者上传下载文件.并且我们也不想在Windows上安装什么东西.那最好的办法就是使用put ...

  5. HashiCorp Vault介绍

    HashiCorp Vault是一款企业级私密信息管理工具.说起Vault,不得不提它的创造者HashiCorp公司.HashiCorp是一家专注于DevOps工具链的公司,其旗下明星级产品包括Vag ...

  6. Css3:transform变形

    transform 语法: transform      向元素应用 2D 或 3D 转换. transform : none | <<span class="title&quo ...

  7. zabbix action理解

    Maintenance status not in maintenance   谷歌翻译:维护状态不在维护中,中文意思就是监控的设备有problem,触发器报警了,然后执行action {TRIGGE ...

  8. 【转】<string> <string.h> <cstring>的区别

    #include < string.h > void main() { string aaa = " abcsd d " ; printf( " lookin ...

  9. 【php】phpExcel使用教程,如何导出excel表格

    [1]下载phpExcel类文件 可在官方去下载 我们只需要classes中的文件,把Classes文件复制到项目中 只需要2个文件就可以了  一个就是phpExcel(刚才我们复制过来的文件 Cla ...

  10. 理解SSL/TLS协议

    理解SSL/TLS协议 背景 早期我们在访问web时使用HTTP协议,该协议在传输数据时使用明文传输,明文传输带来了以下风险: 1.信息窃听风险,第三方可以获取通信内容 2.信息篡改风险,第三方可以篡 ...