levmar ndk 编译

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

欢迎大家关注我,或一起讨论。

时间: 2024-08-04 15:39:18

levmar ndk 编译的相关文章

Android NDK 编译加入so文件

在cocos2d-x中集成百度语音识别的时候,运行build_native.py会把libs/armeabi目录清空. 以下是解决办法,把so文件放在jni/prebuilt里面. 修改Android.mk文件,主要有两行include $(CLEAR_VARS) LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) #百度语音识别so LOCAL_MODULE := BDVoiceRecognitionClient_V1 LOCAL_SRC_FI

[原]如何用Android NDK编译FFmpeg

\我们知道在Ubuntu下直接编译FFmpeg是很简单的,主要是先执行./configure,接着执行make命令来编译,完了紧接着执行make install执行安装.那么如何使用Android的NDK编译出来可以在Android下面可以使用的FFmpeg动态链接库呢?写下这篇文章就是学习如何裁剪并且编译出来可以使用的动态库. 一.获取FFmpeg源码: 首先在编译之前,得获取一份FFmpeg的源码,如果你没有git并且也不打算使用,你可以去FFmpeg官网http://ffmpeg.org/

使用Android Studio自带的NDK编译JNI

/********************************************************************************** * 使用Android Studio自带的NDK编译JNI * 说明: * 省得自己另外去下载NDK,编译JNI,麻烦. * * 2017-4-30 深圳 龙华民治樟坑村 曾剑锋 ****************************************************************************

一个小玩具:NDK编译FFmpeg的例子

FFmpeg NDK编译 和最简单的APK 准备 硬件: 一台电脑,实验在Lenovo T430上 一个Android设备,实验在 三星S3/A7 编译环境: Ubuntu 14.04 (ant\java等命令必须支持) 工具包: NDK: https://dl.google.com/android/ndk/android-ndk32-r10b-linux-x86_64.tar.bz2 SDK:https://dl.google.com/android/adt/adt-bundle-linux-

[Android]Cygwin使用及NDK编译方法

在Windows XP, Cygwin, NDK SDK r5b下成功编译了ffmpeg,下面是完整的编译过程: 一.准备工作 2.下载Cygwin, 请猛击这里 3.下载Android SDK,请猛击这里,Android SDK的网页 4.下载Android NDK SDK r5b, 请猛击这里,NDK SDK的网页 5.下载ffmpeg,可以下载压缩包,也可以git一个snapshot 好了,有必要说明一下Android SDK和Android NDK SDK的区别: Android SDK

工作积累之NDK编译STL (zhuan)

方法: 1.在jni目录下新建Application.mk; 加入 APP_STL :=  stlport_static  右边的值还可以换成下面几个: system - 使用默认最小的C++运行库,这样生成的应用体积小,内存占用小,但部分功能将无法支持 stlport_static - 使用STLport作为静态库,这项是Android开发网极力推荐的 stlport_shared - STLport 作为动态库,这个可能产生兼容性和部分低版本的Android固件,目前不推荐使用. gnust

anroid ndk编译ffmpeg 引用librtmp libx264

Ffmpeg 无处不在,自然android系统少不了它,折腾了不少时间完成 ndk编译ffmpeg,生成so库中引用了外部库librtmp,libx264.条条大路通罗马, 也许还有别的更好的方法去完成它,我没有仔细研究.我使用的方法完全可以达到我的预期目的. 一.选择编译环境 可以选择windows下cygwin,也可以选择linux系统,我建议选择后者.花了很多时间在cygwin下编译,configure时总是提示链接需要的so文件找不到.无奈 之下转到linux环境下编译.我用的版本是ub

NDK编译可执行文件在Android 中运行显示error: only position independent executables (PIE) are supported.失败问题解决办法。

由于使用了NDK编译的可执行文件在应用中调用,在Android 7.0上的运行情况发现,当运行该可执行文件时,报如下错误: error: only position independent executables (PIE) are supported. PIE这个安全机制从4.1引入,但是Android L之前的系统版本并不会去检验可执行文件是否基于PIE编译出的.因此不会报错.但是Android L已经开启验证,如果调用的可执行文件不是基于PIE方式编译的,则无法运行.解决办法非常简单,在A

arm 及ndk编译

首页  »   Android android的armeabi跟armeabi-v7a 网友分享于:2014-03-16  浏览:867次 android的armeabi和armeabi-v7a 在ANE中如果SDK调用了so库,则需要把so库放到ANE下Android-ARM/lib/armeabi (调试模式)或者 armeabi-v7a(发行模式)下. 可以贴个ADT代码说明问题: //m_configType.equals("apk") 是否是发行模式 //(hasCaptiv