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. ElasticSearch快速指南

    ElasticSearch是基于Apache Lucene的分布式搜索引擎, 提供面向文档的搜索服务. 安装ElasticSearch 文档 创建文档 访问文档 更新文档 删除文档 索引 分析器 类型 ...

  2. iOS开发中一些有用的小代码

    1.判断邮箱格式是否正确的代码: //利用正则表达式验证 -(BOOL)isValidateEmail:(NSString *)email {   NSString *emailRegex = @&q ...

  3. pyspider解析

    https://www.cnblogs.com/microman/p/6111711.html #!/usr/bin/env python # -*- encoding: utf-8 -*- # Cr ...

  4. 监控服务器ssh登录,并发送报警邮件

    最近想监控下云主机的ssh登录情况,所以开始写ssh登录报警监控.实现方式并不难. 一:邮箱申请开启SMTP 在邮箱中选择“设置”----->“账户” 在如下图处开启POP3/SMTP服务,并生 ...

  5. 汇编编译器(masm.exe)对jmp的相关处理

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  6. java1.8--Optional类

    身为一名Java程序员,大家可能都有这样的经历:调用一个方法得到了返回值却不能直接将返回值作为参数去调用别的方法.我们首先要判断这个返回值是否为null,只有在非空的前提下才能将其作为其他方法的参数. ...

  7. 基于百度地图SDK和Elasticsearch GEO查询的地理围栏分析系统(3)-前端实现

    转载自:http://www.cnblogs.com/Auyuer/p/8086975.html MoonLight可视化订单需求区域分析系统实现功能: 在现实生活中,计算机和互联网迅速发展,人们越来 ...

  8. Java中的最值

    Double.MAX_VALUE     等于 (2-2^(-52)) * 2^1023 约等于2^1024Double.MIN_VALUE      最小正非零值 2^(-1074)Long.MAX ...

  9. ------- 软件调试——挫败 QQ.exe 的内核模式保护机制 -------

    ------------------------------------------------------------------------ QQ 是一款热门的即时通信(IM)类工具,在安装时刻会 ...

  10. c# 简单实现 插件模型 反射方式

    利用反射方式实现插件模型,wpf控件作为插件,然后用另外的窗体加载. 首先定义插件接口: public interface IUserControlLevel1 { string PluginName ...