android+NDK+Mac安装
2016-01-29 22:31
423 查看
1.概述
最近项目全线转移到Mac下使用使用Android studio开发。遇到关键代码封装到 ***native***层,此时在win下的NDK配置步骤全部失效。 为此,花费了大量时间用来查阅资料,在此,记录下来,分享给大家供以后配置中作为参考。
2.环境
本人使用的开发配置 是:MAC OS 10.10 +androioid studio 1.2+android-ndk-r10e-darwin-x86_64+git 。其他配置类似操作即可。
3.操作流程
1.MAC 下打开终端 获取NDK目录的权限chmod a+x android-ndk-r10c-darwin-x86_64.bin
后面为文件存放路径 。
2.cd 路径。
cd 路径。
如果不知道文件的具体路径,可以直接拖拽到命令终端窗口下即可。
3.继续执行解压命令
./android-ndk-r10c-darwin-x86_64.bin
此时在文件存放路径会得到一个解压完成后的NDK存放目录。
效果如下图:
得到下图说明:解压文件成功。
此时:打开:命令终端:
请按如下步骤操作:
1.输入命令
pico .bash_profile
2.
export NDK_ROOT=/Applications/Android-NDK/android-ndk-r10e
3.
export PATH=$PATH:$NDK_ROOT
最后保存( control+X) 选 Y
4.更新刚配置的环境变量输入
source .bash_profile
验证成功
1.终端下进入 NDK 下的sample 文件夹下
按如下步骤测试是否配置成功:
1.
cd hello-jni/
2. 执行
ndk-build
出现如下界面表示基本变量配置成功。。
使用Android Sutdio创建一个新的工程后,接下来记录创建NDK工程的基本步骤。
本文将达到:
1. 创建NDK工程
2. 在JNI中输出Log语句
3. 指定编译的so库的abi版本
4. 解决在创建NDK工程中的问题
Step: 1. 添加native接口
注意写好native接口和System.loadLibrary()即可了,并无特别之处。
P.S:onCreate()中对R.id.txt执行setText(),所以这里需要对xml布局文件按正常的开发步骤进行修改即可。
直接给出代码如下:
[java] view
plain copy
public class MainActivity extends Activity{
static {
System.loadLibrary("JniTest");
}
public native String getStringFromNative();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView txtView = (TextView) findViewById(R.id.txt);
txtView.setText(getStringFromNative());
}
}
Step: 2.执行Build->Make Project
这一步骤执行一下,验证工程中并无其它错误,并对工程进行了编译,生成了.class文件.
.class文件的生成路径是在 app_path/build/intermediates/classes/debug下的.如下图:
Step: 3.javah生成c头文件
点击"View->Tool Windows->Terminal",即在Studio中进行终端命令行工具.执行如下命令生成c语言头文件。
这里需要注意的是要进入 <Project>\app\src\main的目录下执行javah命令,为的是生成的 .h 文件同样是在<Project>\app\src\main路径下,可以在Studio的工程结构中直接看到。
操作命令:
javah -d jni -classpath <SDK_android.jar>;<APP_classes> lab.sodino.jnitest.MainActivity
具体操作图如下:
[java] view
plain copy
javah -d jni -classpath c:\Users\sodinochen\AppData\Local\Android\sdk\platforms
\android-16\android.jar;..\..\build\intermediates\classes\debug lab.sodino.jnitest.MainActivity
对于"主版本51比50新,此编译器支持最新的主版本"则是由于电脑上安装了两个版本的jdk引起的,而当前使用的是旧的jdk。
把旧的jdk删除,并执行java version命令后显示当前jdk为最新的1.7时,则不会再有此提示了。如下图:
最后的生成结果:
Step: 4.编辑c文件
在main.c文件中实现头文件中的方法,具体功能为直接return回一个String,并且使用android_log打印出相关日志。
代码如下:
[cpp] view
plain copy
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
#include <android/log.h>
#ifndef LOG_TAG
#define LOG_TAG "ANDROID_LAB"
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
#endif
/* Header for class lab_sodino_jnitest_MainActivity */
#ifndef _Included_lab_sodino_jnitest_MainActivity
#define _Included_lab_sodino_jnitest_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: lab_sodino_jnitest_MainActivity
* Method: getStringFromNative
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_lab_sodino_jnitest_MainActivity_getStringFromNative
(JNIEnv * env, jobject jObj){
LOGE("log string from ndk.");
return (*env)->NewStringUTF(env,"Hello From JNI!");
}
#ifdef __cplusplus
}
#endif
#endif
到这里后,我们再执行一个"Build->Make Project",发现"Messages Gradle Build"会给出提示如下:
[java] view
plain copy
Error:Execution failed for task ':app:compileDebugNdk'.
> NDK not configured.
Download the NDK from http://developer.android.com/tools/sdk/ndk/.Then add ndk.dir=path/to/ndk in local.properties.
(On Windows, make sure you escape backslashes, e.g. C:\\ndk rather than C:\ndk)
这里提示了NDK未配置,并且需要在工程中的local.properties文件中配置NDK路径。好了,提示很清楚了,那我们就进入下一步吧。
Step: 5.配置NDK
这一步包括两个动作:
1.指明ndk路径
2. 修改build.gradle配置
工程中共有两个build.gradle配置文件,我们要修改的是在<Project>\app\build.gradle这个文件。为其在defaultConfig分支中增加上
[java] view
plain copy
ndk {
moduleName "JniTest"
ldLibs "log", "z", "m"
abiFilters "armeabi", "armeabi-v7a", "x86"
}
以上配置代码指定的so库名称为JniTest,链接时使用到的库,对应android.mk文件中的LOCAL_LDLIBS,及最终输出指定三种abi体系结构下的so库。
添加后如下图:
这时,再执行"Build->Rebuild Project",就可以编译出so文件了。
但在Window平台上会出现一个问题:
[java] view
plain copy
Error:Execution failed for task ':app:compileDebugNdk'.
> com.android.ide.common.internal.LoggedErrorException: Failed to run command:
D:\Mission\adt-bundle-windows\ndk-r10b\ndk-build.cmd NDK_PROJECT_PATH=null APP_BUILD_SCRIPT=C:\Users\sodinochen\AndroidstudioProjects\JniTest2\app\build\intermediates\ndk\debug\Android.mk APP_PLATFORM=android-21 NDK_OUT=C:\Users\sodinochen\AndroidstudioProjects\JniTest2\app\build\intermediates\ndk\debug\obj NDK_LIBS_OUT=C:\Users\sodinochen\AndroidstudioProjects\JniTest2\app\build\intermediates\ndk\debug\lib APP_ABI=armeabi,armeabi-v7a,x86
Error Code:
2
Output:
make.exe: *** No rule to make target `C:\Users\sodinochen\AndroidstudioProjects\JniTest2\app\build\intermediates\ndk\debug\obj/local/armeabi/objs/JniTest/C_\Users\sodinochen\AndroidstudioProjects\JniTest2\app\src\main\jni', needed by `C:\Users\sodinochen\AndroidstudioProjects\JniTest2\app\build\intermediates\ndk\debug\obj/local/armeabi/objs/JniTest/C_\Users\sodinochen\AndroidstudioProjects\JniTest2\app\src\main\jni\main.o'. Stop.
出现这个错误很莫名其妙..几番折腾下,找到一个视频出来了大概原因及解决方式:
出处见Youtube视频 02:50分开始:https://www.youtube.com/watch?v=okLKfxfbz40#t=362
在Windows下NDK一个bug,当仅仅编译一个文件时出现会出现此问题,解决方法就是再往jni文件夹加入一个空util.c文件即可。如下图:
编译出来的库文件被Studio输出到了下图的路径中
Step: 6.安装运行
界面:
查看Log打印:
顶13
踩0
相关文章推荐
- Android--viewpager
- Android 简单欢迎页面设计
- Android 带固定图片的EditText
- Android基础之Activity的生命周期
- Android--viewpager学习
- android 导入数据库
- AndroidStudio学习笔记
- Android Studio 生成APK出现的「前言不允许有内容」错误
- Android 中ViewPager+fragment报异常:IllegalStateException:Can't change tag of fragment的一种解决思路
- Android--viewpager学习
- xml读取.sax解析方式 使用于Android 和java中 ,代码是java的, 在Android中只需要 区别监听类中的参数(localName,qName),相反的,java中使用qname 为节点的名称;
- Android 基础 —— 活动的生存周期
- Android 基础 —— 活动的启动模式
- Android 主题切换
- Android 四大组件 —— 服务
- Android特色服务之定位服务(百度地图开发一)
- android Broadcast 生命周期详细分析
- Android中实现静态的默认安装和卸载应用
- Android 一行显示全部内容的TextView--SingleLineTextView
- Android各个版本API的区别