作者 : 韩曙亮

转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/52088039

最近在移植一个 JNI 项目, 比较纠结, Android Studio 中 NDK 到底怎么配置啊...  Android 官方的示例总是不稳定, 这两个月都改变了好几次了, Gradle 插件之前支持的后来也不支持了, 遇到各种问题, 最后还是用命令行编译, 然后将 so 库导入到 Android Studio 项目中;

1. NDK 开发遇到的问题

NDK 开发遇到的问题 :

-- 之前使用的 Gradle 插件版本 : classpath 'com.android.tools.build:gradle:2.2.0-alpha4' ;

-- 之前使用的 Gradle 版本 : distributionUrl=https\://services.gradle.org/distributions/gradle-2.14-all.zip;

-- 这个版本使用 ndk 使用的配置是 : 在 Moudle 中的 build.gradle 中 的 android 中的 defaultConfig 中 如下配置, 即可编译 jni 代码;

externalNativeBuild{
            ndkBuild{
                path 'src/main/jni/Android.mk'
            }
        }

-- 插件版本低错误 : 昨天用的好好的, 今天打开居然编译不通过, 应该是更新了最新的 Android Studio 导致的, 报出如下错误 :

Error:(1, 0) Plugin is too old, please update to a more recent version, or set ANDROID_DAILY_OVERRIDE environment variable to "dad44248ed636c3b2fa21c7dea26e2d05b0d650b"

-- 错误原因 : 经过检查发现是 gradle 插件 和 工具 版本太低, 查询最新的工具版本;

-- 查询 Gradle 插件最新版本 : 查询地址 https://jcenter.bintray.com/com/android/tools/build/gradle/, 经查询 最新版本是 2.2.0-alpha6;

-- 查询 Gradle 工具最新版本 : 查询地址 http://services.gradle.org/distributions, 最新版本是 gradle-2.14.1-all.zip;

-- gradle-wrapper.properties 配置 :

distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip

-- Gradle 插件配置 :

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.0-alpha6'
        //classpath 'com.android.tools.build:gradle:2.1.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

-- 插件不支持 : 居然不支持 ndk path 设置 Android.mk 了, 居然不支持了 ... 无语了;

Gradle sync failed: Could not find method path() for arguments [src/main/jni/Android.mk] on object of type com.android.build.gradle.internal.dsl.ExternalNativeNdkBuildOptions.
          Consult IDE log for more details (Help | Show Log)

-- 其它问题 : 不仅如此, C 项目的代码跳转 查看 功能也不能使用了, 代码也不让好好看了, 不稳定版本各种问题;

2. 暂时方案 Android 工程直接使用 命令行编译好的 so 库

暂时的方案 :

-- 使用命令行 ndk-build 生成 so 库, 然后 Android 项目中直接使用 so 库;

-- 编译项目 : 进入 c 语言项目, 直接使用 ndk-build 编译, 确保你的 Android.mk 是正确的;

bogon:jni octopus$ ndk-build
[armeabi] Compile thumb  : fluidsynth-android <= fluid_adriver.c
[armeabi] Compile thumb  : fluidsynth-android <= fluid_dll.c
[armeabi] Compile thumb  : fluidsynth-android <= fluid_list.c
[armeabi] Compile thumb  : fluidsynth-android <= fluid_seq.c
[armeabi] Compile thumb  : fluidsynth-android <= fluid_mdriver.c
[armeabi] Compile thumb  : fluidsynth-android <= fluid_seqbind.c
[armeabi] Compile thumb  : fluidsynth-android <= fluid_aufile.c
[armeabi] Compile thumb  : fluidsynth-android <= fluid_cmd.c
[armeabi] Compile thumb  : fluidsynth-android <= fluid_dsp_float.c
[armeabi] Compile thumb  : fluidsynth-android <= fluid_midi.c
[armeabi] Compile thumb  : fluidsynth-android <= fluid_settings.c
[armeabi] Compile thumb  : fluidsynth-android <= fluid_chan.c
[armeabi] Compile thumb  : fluidsynth-android <= fluid_midi_router.c
[armeabi] Compile thumb  : fluidsynth-android <= fluid_sndmgr.c
[armeabi] Compile thumb  : fluidsynth-android <= fluid_chorus.c
[armeabi] Compile thumb  : fluidsynth-android <= fluid_event.c
[armeabi] Compile thumb  : fluidsynth-android <= fluid_synth.c
[armeabi] Compile thumb  : fluidsynth-android <= fluid_gen.c
[armeabi] Compile thumb  : fluidsynth-android <= fluid_mod.c
[armeabi] Compile thumb  : fluidsynth-android <= fluid_sys.c
[armeabi] Compile thumb  : fluidsynth-android <= fluid_conv.c
[armeabi] Compile thumb  : fluidsynth-android <= fluid_hash.c
[armeabi] Compile thumb  : fluidsynth-android <= fluid_tuning.c
[armeabi] Compile thumb  : fluidsynth-android <= fluid_voice.c
[armeabi] Compile thumb  : fluidsynth-android <= fluid_io.c
[armeabi] Compile thumb  : fluidsynth-android <= fluid_dart.c
[armeabi] Compile thumb  : fluidsynth-android <= fluid_ramsfont.c
[armeabi] Compile thumb  : fluidsynth-android <= fluid_defsfont.c
[armeabi] Compile thumb  : fluidsynth-android <= fluid_rev.c
[armeabi] Compile thumb  : fluidsynth-android <= main.c
[armeabi] SharedLibrary  : libfluidsynth-android.so
[armeabi] Install        : libfluidsynth-android.so => libs/armeabi/libfluidsynth-android.so


-- 拷贝 so 库到 Android 项目中 : 在 src/main 目录下创建 jniLibs 目录, 将 ndk 编译后的 armeabi 目录拷贝到该目录, 运行正确;

.

3. 使用 Source Insight 查看 NDK 源码

中文乱码问题 : SourceInsight 不支持 UTF-8 格式的编码, 这里需要将 UTF-8 的项目转为 GBK 格式的, 然后再导入到 SourceInsight 中;

转换命令 : 创建一个 convert 目录, 其中有两个目录 jni_utf-8 和 jni_gb18030 目录, 下面的命令用于 两种编码之间的转换;

-- GBK 转 UTF-8 : 进入 jni_gb18030 目录, 执行下面的命令;

bogon:jni octopus$ cp -R . ../jni_utf-8
bogon:jni octopus$ find . -type f -exec bash -c 'iconv -f GB18030 "{}" 1>/dev/null 2>/dev/null && iconv -f GB18030 -t utf-8 "{}" > ../jni_utf-8/"{}"' \;

-- UTF-8 转 GBK : 进入 jni_utf-8 目录, 执行下面的命令;

bogon:jni octopus$ cp -R . ../jni_gb18030
bogon:jni octopus$ find . -type f -exec bash -c 'iconv -f utf-8 "{}" 1>/dev/null 2>/dev/null && iconv -f utf-8 -t GB18030 "{}" > ../jni_gb18030/"{}"' \;

拷贝项目 : 将转换后的 jni_gb18030 目录中的项目拷贝到 SourceInsight 中即可查看该项目;

Android Studio NDK 代码 Source Insight调试 (NDK 目前开发方案 | NDK 编译 | 导入 so 库 | 项目编码转换)的更多相关文章

  1. [Android Studio 权威教程]断点调试和高级调试

    好了开始写一个简单的调试程序,我们先来一个for循环 ? 1 2 3 4 5 6 7 8 <code class="language-java hljs ">for ( ...

  2. android studio 实现代码混淆

    =======本文章属于转载==========原文章地址:http://my.oschina.net/aibenben/blog/370985 这篇文章等是跟大家分享一在Android studio ...

  3. Android Studio在代码重构中的妙用

    代码重构几乎是每个程序员在软件开发中必须要不断去做的事情,以此来不断提高代码的质量.Android Stido(以下简称AS)以其强大的功能,成为当下Android开发工程师最受欢迎的开发工具,也是A ...

  4. android studio上代码编译调试中遇到的一些异常记录

    下面是记录的在平时代码编写或编译时的一些异常,答案有自己摸索出来的,也有参考其他程序猿朋友的,参考文章过多,就不一一贴出来了. ① E/JavaBinder: !!! FAILED BINDER TR ...

  5. Android Studio 使用正式签名进行调试

    在Android Studio中,能够使用Gradle进行打包时自己主动签名. 事实上Android Studio默认会给调试应用加上Debug签名,但有时候调一些第三方SDK时.须要正式签名才干调起 ...

  6. Android studio 显示代码行号 设置

    首先我们打开我们的Android Studio.   这时会弹出setting页面,我们选择show line numbers然后点击确定按钮.   此时我们就可以看到代码左侧显示出行号了   我们可 ...

  7. 【Android】Android Studio 进行代码混淆,打包release APK

    整了一天,感觉坑挺多. 1. 选择如图中的选项Android Studio进行签名打包: 2. 填写APP对应的信息:(最好用个文本记下来放在项目中同步给Team) - Key store path: ...

  8. android studio 改变代码提示的方法

    移通152余继彪 在android studio中 默认代码提示的功能是ctrl+空格,这样的提示会和输入法造成冲突,所以要改变 改变的方法就是file—seting——Keymap然后搜索basic ...

  9. Android studio在真机上进行调试

    1.在Android Studio中,把app的默认启动目标改为USB device,点击[app]→[app configuration],在[Target Device]选择[USB device ...

随机推荐

  1. MySQL获取XML格式数据

    通过再调用mysql工具时使用--xml选项: C:\Users\wang>mysql -uroot -p --xml mydb Enter password: ******** Welcome ...

  2. A Neural Algorithm of Artistic Style 图像风格转换 - keras简化版实现

    前言 深度学习是最近比较热的词语.说到深度学习的应用,第一个想到的就是Prisma App的图像风格转换.既然感兴趣就直接开始干,读了论文,一知半解:看了别人的源码,才算大概了解的具体的实现,也惊叹别 ...

  3. Gold well平台罗琪:叙利亚战火令黄金看涨意愿强烈

    Gold well平台罗琪:叙利亚战火令黄金看涨意愿强烈基本面分析:纸黄金交易通网显示,全球最大黄金上市交易基金(ETF)截至04月14日黄金持仓量较上日持平,当前持仓量为865.89吨,本月止净增持 ...

  4. scrapy爬取数据进行数据库存储和本地存储

    今天记录下scrapy将数据存储到本地和数据库中,不是不会写,因为小编每次都写觉得都一样,所以记录下,以后直接用就可以了-^o^- 1.本地存储 设置pipel ines.py class Ak17P ...

  5. 计蒜客模拟赛5 D2T1 成绩统计

    又到了一年一度的新生入学季了,清华和北大的计算机系同学都参加了同一场开学考试(因为两校兄弟情谊深厚嘛,来一场联考还是很正常的). 不幸的是,正当老师要统计大家的成绩时,世界上的所有计算机全部瘫痪了. ...

  6. [Codeforces]852A - Digits

    题目大意:给一个10^200000以内的数字,支持一种操作:在数字之间加若干个加号,把原数字变为加法运算后的结果,要求在三次操作内把数字变成个位数,输出方案. 做法:直观的想法是每两位之间都塞加号,事 ...

  7. ●POJ poj 2112 Optimal Milking

    ●题目大意: 给出K个挤奶机器(编号1~K),C头牛(编号K+1~K+C)(机器和牛各在不同的地方)和每台机器最多可M头牛挤奶: 然后以邻接矩阵告诉各点间的直接距离(不同的地方间若直接距离等于0,则表 ...

  8. 勤拂拭软件系列教程 - java web开发

    勤拂拭软件工作室持续推出Java Web开发系列教程与案例,供广大朋友分享交流技术经验,帮助喜欢java的朋友们学习进步: 1. 勤拂拭软件 java web 开发教程(1) - 开发环境搭建 勤拂拭 ...

  9. QSDK下驱动AR8035

    0 概述 QSDK平台中,我所接触到的版本,能支持MIPS架构的,是基于Openwrt AA版本:虽然CC版本上就已经能很好地支持AR8035了,可是AA版本它本身是不支持的,于是不断有人要求提供补丁 ...

  10. mysql免安装版下载及配置教程

    第一步:下载 下载地址:http://dev.mysql.com/downloads/mysql/ 滚动到下方就能看到了,根据自己的需求下载: 我的电脑为64为的所以下载的为 Windows (x86 ...