作者 : 韩曙亮

转载请注明出处 : 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. TCP/IP学习笔记(二):TCP连接的建立与终止

    TCP连接的三次握手: (1)请求短发送一个SYN段指明客户打算连接的服务器的端口,以及初始序号ISN(1415535521),报文段中SYN=1:TCP规定:SYN报文段不能携带数据,但是要消耗一个 ...

  2. 【PYTHON】递加计数器

    计数本:number.txt 1 2 3 4 主程序:计数器 # Author: Stephen Yuan # 递加计算器 import os # 递加计算器 def calc(): file_siz ...

  3. MariaDB表表达式(2):CTE

    本文目录: 1.非递归CTE 2.递归CTE 2.1 语法 2.2 递归CTE示例(1) 2.3 递归CTE示例(2) 2.4 递归CTE示例(3) 公用表表达式(Common Table Expre ...

  4. Java四种线程池的学习与总结

    在Java开发中,有时遇到多线程的开发时,直接使用Thread操作,对程序的性能和维护上都是一个问题,使用Java提供的线程池来操作可以很好的解决问题. 一.new Thread的弊端 执行一个异步任 ...

  5. mac版chrome升级到Version 65.0.3325.18后无法打开百度bing搜狗

    mac版本chrome升级到Version 65.0.3325.18后发现突然无法访问百度,搜狗,bing,神马等一系列的国内搜索引擎网站.连百度的儿子们比如知道,百度百科都无法访问. 1.首先想到的 ...

  6. 从零开始搭建支持http2的web服务

    前段时间开始,公司各项业务开始陆续接入http2,关于http2的优点与所适用的场景网上有很多的文档可以查阅,这里我主要是总结分享一下如何从0到1搭建http2服务. 这里先说明一下,要完成http2 ...

  7. pyqt5 动画学习(三) 指定控件的移动轨迹

    这一篇来讲解自定义控件的移动轨迹 原理:我们采用QPainterPath先画一个弧线,然后加载一个物体让物体移动,设置100个关键帧,每个关键帧物体的坐标位置就是弧线的坐标位置,这样就能达到按照指定轨 ...

  8. 【Swift】ios开发中巧用 description 打印对象时,打印对象的属性

    ios开发中我们打印对象的时候,会直接输出对象地址,这样不方便我们开发.我们可以 巧用 description 打印对象时,输出对象的属性 在oc中直接重写即可.swift中需要遵守Printable ...

  9. dnslog搭建

    为什么想重写这个呢,想说后面扫描ssrf和命令执行的时候,能快速改成自己想要的api,更容易修改一些. 工具改自:https://github.com/bugScanTeam/DNSLog 需要两个域 ...

  10. 【LSGDOJ 1852】青蛙的烦恼 DP

    题目描述 池塘中有n片荷叶恰好围成了一个凸多边形,有一只小青蛙恰好站在1号荷叶上,小青蛙想通过最短的路程遍历所有的荷叶(经过一个荷叶一次且仅一次),小青蛙可以从一片荷叶上跳到另外任意一片荷叶上. 输入 ...