Android Studio NDK 代码 Source Insight调试 (NDK 目前开发方案 | NDK 编译 | 导入 so 库 | 项目编码转换)
作者 : 韩曙亮
转载请注明出处 : 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 库 | 项目编码转换)的更多相关文章
- [Android Studio 权威教程]断点调试和高级调试
好了开始写一个简单的调试程序,我们先来一个for循环 ? 1 2 3 4 5 6 7 8 <code class="language-java hljs ">for ( ...
- android studio 实现代码混淆
=======本文章属于转载==========原文章地址:http://my.oschina.net/aibenben/blog/370985 这篇文章等是跟大家分享一在Android studio ...
- Android Studio在代码重构中的妙用
代码重构几乎是每个程序员在软件开发中必须要不断去做的事情,以此来不断提高代码的质量.Android Stido(以下简称AS)以其强大的功能,成为当下Android开发工程师最受欢迎的开发工具,也是A ...
- android studio上代码编译调试中遇到的一些异常记录
下面是记录的在平时代码编写或编译时的一些异常,答案有自己摸索出来的,也有参考其他程序猿朋友的,参考文章过多,就不一一贴出来了. ① E/JavaBinder: !!! FAILED BINDER TR ...
- Android Studio 使用正式签名进行调试
在Android Studio中,能够使用Gradle进行打包时自己主动签名. 事实上Android Studio默认会给调试应用加上Debug签名,但有时候调一些第三方SDK时.须要正式签名才干调起 ...
- Android studio 显示代码行号 设置
首先我们打开我们的Android Studio. 这时会弹出setting页面,我们选择show line numbers然后点击确定按钮. 此时我们就可以看到代码左侧显示出行号了 我们可 ...
- 【Android】Android Studio 进行代码混淆,打包release APK
整了一天,感觉坑挺多. 1. 选择如图中的选项Android Studio进行签名打包: 2. 填写APP对应的信息:(最好用个文本记下来放在项目中同步给Team) - Key store path: ...
- android studio 改变代码提示的方法
移通152余继彪 在android studio中 默认代码提示的功能是ctrl+空格,这样的提示会和输入法造成冲突,所以要改变 改变的方法就是file—seting——Keymap然后搜索basic ...
- Android studio在真机上进行调试
1.在Android Studio中,把app的默认启动目标改为USB device,点击[app]→[app configuration],在[Target Device]选择[USB device ...
随机推荐
- C/C++下调用matlab函数操作说明
1.matlab的安装 连接:http://pan.baidu.com/s/1qXuF7aO 安装32位版本的matlab(在目录下bin文件夹中有两个文件夹,选择win32文件夹下的setup进行安 ...
- 用golang实现常用算法与数据结构——跳跃表(Skip list)
背景 最近在学习 redis,看到redis中使用 了skip list.在网上搜索了一下发现用 golang 实现的 skip list 寥寥无几,性能和并发性也不是特别好,于是决定自己造一个并发安 ...
- Java进阶篇(二)——抽象类、内部类
之前在类和对象中我们说到了类的普通特性,本篇将介绍类的一些高级特性. 一.抽象类 抽象类:抽象类是只声明方法的存在而不去具体实现它的类.抽象类不能被实例化,也就是不能创建其对象.使用abstract关 ...
- mysql如何选择合适的数据类型1:CHAR与VARCHAR
CHAR和VARCHAR类型类似,都用来存储字符串,但它们"保存"和"检索"的方式不同.CHAR属于"固定长度"的字符串,而VARCHAR属 ...
- drupal 8 之 calendar模块
一.安装模块 calendar.view.date三个模块同时安装 二.创建一个事件内容类型 主要的是有一个时间字段 然后添加一个事件内容进行测试 [保存并发布] 三.创建日历视图 点击[结构]> ...
- 使用 Cesium 动态加载 GeoJSON 数据
前言 需求是这样的,我需要在地图中显示 08 年到现在的地震情况,地震都是发生在具体的时间点的,那么问题就来了,如何实现地震情况按照时间动态渲染而不是一次全部加载出来. 一. 方案分析 这里面牵扯到两 ...
- [SHOI2017]相逢是问候
Description 信息将你我连结.B君希望以维护一个长度为n的数组,这个数组的下标为从1到n的正整数.一共有m个操作,可以 分为两种:0 l r表示将第l个到第r个数(al,al+1,...,a ...
- 洛谷P2405 non天平
题目背景 non最近正在为自己的体重而苦恼,他想称量自己的体重.于是,他找来一个天平与许多砝码. 题目描述 砝码的重量均是n的幂次,n^1.n^2.n^3.n^4.n^5的……non想知道至少要多少个 ...
- ●洛谷P1291 [SHOI2002]百事世界杯之旅
题链: https://www.luogu.org/recordnew/show/5861351题解: dp,期望 定义dp[i]表示还剩下i个盖子没收集时,期望还需要多少次才能手机完. 初始值:dp ...
- 例10-3 uva10375(唯一分解定理)
题意:已知C(m,n) = m!/(n!(m-n)!),已知p,q,r,s,求C(p,q)/C(r,s) 思路: 全部分解成质因子,相乘则加,除则减 #include <iostream> ...