作者 : 韩曙亮

转载请注明出处 : 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. 单链表创建、删除、查找、插入之C语言实现

    本文将详细的介绍C语言单链表的创建.删除.查找.插入以及输出功能 一.创建 #include<stdio.h> #include<stdlib.h> typedef int E ...

  2. Django REST framework+Vue 打造生鲜超市(十)

    十一.pycharm远程代码调试 第三方登录和支付,都需要有服务器才行(回调url),我们可以用pycharm去远程调试服务器代码 服务器环境搭建 以全新阿里云centos7系统为例: 11.1.阿里 ...

  3. jenkins实战(一):war安装及插件安装

    一:整体介绍 以下摘自维基百科: Jenkins是一个用Java编写的开源的持续集成工具.在与Oracle发生争执后,项目从Hudson项目复刻. Jenkins提供了软件开发的持续集成服务.它运行在 ...

  4. Mac OS X磁盘重新分区后 BootCamp Windows启动项丢失

    前言 我有一台Mac,装有OS X和Windows两系统,因Windows和OS X都能读写exFAT分区, 故若在Machintosh HD和Windows HD之间开辟一个exFAT分区,可以作为 ...

  5. [JSOI 2011]分特产

    Description JYY 带队参加了若干场ACM/ICPC 比赛,带回了许多土特产,要分给实验室的同学们. JYY 想知道,把这些特产分给N 个同学,一共有多少种不同的分法?当然,JYY 不希望 ...

  6. 51Nod 1555 布丁怪

    题目描述: 布丁怪这一款游戏是在一个n×n 的矩形网格中进行的,里面有n个网格有布丁怪,其它的一些格子有一些其它的游戏对象.游戏的过程中是要在网格中移动这些怪物.如果两个怪物碰到了一起,那么他们就会变 ...

  7. hdu 4288 离线线段树+间隔求和

    Coder Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  8. NFC Spy:基于Android 4.4及以上手机的非接智能卡跟踪仪

    NFC Spy 用来查看读卡器和智能卡之间的指令.数据的交互传输过程,以便 NFC/HCE 开发者分析研究底层通讯协议,定位错误指令. 本程序要使用两部带有 NFC 硬件的 Android 手机,并且 ...

  9. Python使用wmi获取Windows相关信息

    在使用Python获取Windows系统上的相关的信息可以使用WMI接口来获取, 什么是wmi? WMI是一项核心的Windows管理技术,WMI作为一种规范和基础结构,通过它可以访问.配置.管理和监 ...

  10. vue拦截器实现统一token,并兼容IE9验证

    项目中使用vue搭建前端页面,并通过axios请求后台api接口,完成数据交互.如果验证口令token写在在每次的接口中,也是个不小的体力活,而且也不灵活.这里分享使用vue自带拦截器,给每次请求的头 ...