android studio ndk-builld方式开发

之前都是在Ubuntu开发,项目也是老的,自然也就顺理成章的用eclipse做各种android的开发。最近想在android studio 切换下,有点不习惯。android studio 为ndk开发提供了两种不同的方式,使用cmake自动编译脚本 和类似eclipse上的ndk-build。这两者之间使用区别在于,如果想直接开发新的单模块可以考虑使用cmake,ide有自带辅助插件,让程序员使用起来更加舒心。如果想在第三方源码库上面做二次开发,或者需要多个源码库关联,感觉还是使用ndk-build会更加灵活,或者说老经验不用重新踩那么多坑。

关于环境搭建的可以参考android 开发者文档,里面有详细的说明

https://developer.android.google.cn/studio/projects/add-native-code.html#link-gradle

下面就在android studio建一个ndk的sample项目。

1、新建一个一般项目,添加jni文件夹以及子目录include 存放头文件,src存放源码

2、在java代码中,新建 TestJni类调用native方法,并使用javah命令生成头文件

3创建相应的方法文件

回到main目录下

? classpath:类搜索路径,这里表示从当前的 bin 目录下查找

? d:将生成的头文件放到当前的 jni 目录下

? o: 指定生成的头文件名称,默认以类全路径名生成(包名+类名.h)

注意: -d 和-o 只能使用其中一个参数。

刷新下android studio的项目目录就可以看到

上面javah的指令,为了后面方便使用,可以在external tools中自定义。File->Setting->Tools ->External Tools 点击添加

这样就可以在需要包含native方法的的文件中右键使用

4 cmake方法会根据脚本提供自动生成的Android.mk脚本,不过ndk-build 方法就需要自己编写编译配置脚本Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_C_INCLUDES += $(LOCAL_PATH)/include  \

$(LOCAL_PATH)/src

LOCAL_SRC_FILES := src/hello-jni.c

LOCAL_MODULE    := NativeLib

include $(BUILD_SHARED_LIBRARY)

Android.mk文档必须以LOCAL_PATH变量的定义开头。

LOCAL_PATH := $(call my-dir)

Android 构建系统利用LOCAL_PATH来定位源文件。因为将该变量设置为硬编码值并不合适,所以Android构建系统提供了一个名为 my-dir 的宏功能。通过将该变量设置为my-dir宏功能的返回值,可以将其放在当前目录下。

Android 构建系统将CLEAR_VARS变量设置为clear_vars.mk片段的位置。包含Makefile片段可以清除除了LOCAL_PATH 以外的LOCAL_<name>变量,例如LOCAL_SRC_FILES,LOCAL_MODULE   等。

include $(CLEAR_VARS)

这样做是因为 Android构建系统在单次执行中解析多个构建文件和模块定义,而LOCAL_<name>是全局变量。清楚他们可以避免冲突,每一个原生组件被称为一个模块。

LOCAL_MODULE  变量用来给这些模块设定一个唯一的名称。下面的代码将该模块的名称设为NativeLib。

LOCAL_MODULE    := NativeLib

其实

LOCAL_MODULE    := libNativeLib

结果也是可以的,编译的生成结果,构建系统会自动添加适当的前缀后缀生成动态共享文件 ,如果前面已经添加lib,那么还会是原样,如:libNativeLib.so。可以在路径  "项目路径\unit2\app\build\intermediates\ndkBuild\debug\obj\local\架构类型\"看到。

用LOCAL_C_INCLUDES 指定头文件的搜索路径,LOCAL_SRC_FILES指定源文件列表,多个文件可以使用空格分开的多个源文件名字。

到这里,就简单描述了一个原生项目。编译和生成实际模块的构建系统还需要包含合适的构建系统片段,具体取决于想要生成的模块的类型。

include $(BUILD_SHARED_LIBRARY)

其中BUILD_SHARED_LIBRARY是一个指向生成共享文件的脚本。

有下面三种文件生成格式

BUILD_STATIC_LIBRARY:编译为静态库。 
BUILD_SHARED_LIBRARY :编译为动态库

BUILD_EXECUTABLE:编译为Native C可执行程序

这里就不展开了

在android studio编译原生项目,还需要配置module(app)目录下的build.gradle。下面是需要添加的内容

android {

defaultConfig {

ndk{

abiFilters "armeabi","armeabi-v7a","x86"

}

}

externalNativeBuild{

ndkBuild{

path "src/main/jni/Android.mk"

}

}

}

apk在不同硬件平台运行时,要根据cpu架构调用不同的共享文件。

ndk{

abiFilters "armeabi","armeabi-v7a","x86"

}

就会生成三种适合不同cpu架构的共享文件,

不配置的话,系统将会默认生成支持的所有架包,如果ndk配置发生改变,要clean project

externalNativeBuild{

ndkBuild{

path "src/main/jni/Android.mk"

}

}

选择cmake还是ndk-build都需要在这里面写明脚本路径

接下来就跑跑项目看效果。

时间: 08-05

android studio ndk-builld方式开发的相关文章

android studio NDK 开发初探

android studio NDK 开发初探 环境配置 1)下载ndk 2)在android studio中配置ndk 路径 3)配置gradle 在gradle.properties中加入 android.useDeprecatedNdk=true配置 开启ndk 在开发过程中我们有时还会用到c++中到stl库这时我们就需要在build.gradle 中加入 defaultConfig { ndk { moduleName "jnitest" stl "stlport_s

Android Studio NDK开发

整理完Eclipse的NDK开发,再整理下Android Studio的.. 一个比较不错的百度网盘: http://pan.baidu.com/share/home?uk=2383159761  经常更新最新的Android方面的开发包,可以到里面下载到ndk的包 创建一个Android的工程,放一个TextView用于显示文字,功能很简单,从native层获取字符串并显示到TextView上 然后编写相关代码: public class MainActivity extends AppCom

Android Studio入门(安装--&gt;开发调试)

写在前面的话:本文来源:http://blog.csdn.net/yanbober/article/details/45306483 目标:Android Studio新手–>下载安装配置–>零基础入门–>基本使用–>调试技能–>构建项目基础–>使用AS应对常规应用开发 下载安装 下载AS前先说下,AS安装包分为含SDK版本和不含SDK版本下载,如果你有SDK,那么完全可以下载不含SDK版本:不过下载了含SDK版本也没事,安装时选择自定义SDK也可以,安装后重新指定SD

android studio ndk配置和ndk开发

配置开发环境: 1:下载ndk,导入android studio中. 2:在项目中引入NDK   3:在计算机path变量中导入NDK路径,在编译.h文件的时候会用到. 一:建立java的native方法,然后编译生成.class文件. 二:根据.class文件生成.h文件. 1:打开Terminal,然后进入APP目录下的main主目录. 2:输入命令. 3:生成.h文件,生成的jni文件夹在main文件夹下. 三:根据.h文件编写.c文件. #include <string.h> #inc

Android Studio NDK 开发配置

一:使用gradle experimental plugin 首先,我们不能用android studio默认的gradle插件,我们需要把android studio的插件改为gradle experimental plugin, 这个plugin是google开发的,网址在这里: http://tools.android.com/tech-docs/new-build-system/gradle-experimental Gradle experimental plugin是android 

Android Studio NDK 入门教程(2)--Java与C++之间的简单数据转换与传递

概述 本文将讲解Java与原生代码之间的数据转换,包括基础类型之间的转换,以及数组的传递与转换. 类型转换表 JAVA基础类型与C++之间的对应表 Java类型 C/C++类型 描述 boolean jboolean 无符号8位整数 byte jbyte 无符号8位整数 char jchar 有符号16位整数 short jshort 有符号16位整数 int jint 有符号32位整数 long jlong 有符号64位整数 float jfloat 32位单精度浮点数 double jdou

Android Studio NDK 入门教程(5)--Java对象的传递与修改

概述 本文主要Java与C++之间的对象传递与取值.包括传递Java对象.返回Java对象.修改Java对象.以及性能对比. 通过JNIEnv完成数据转换 Java对象是存在于JVM虚拟机中的,而C++是脱离JVM而运行的,如果在C++中访问和使用Java中的对象,必然会使用JNIEnv这个桥梁.其实通过下面的代码很容易看出,这种访问方式和Java中的反射十分雷同. 这里定义一个简单Java对象用于下文测试: package com.example.wastrel.hellojni; /** *

Android NDK and OpenCV Development With Android Studio

Android NDK and OpenCV Development With Android Studio Hujiawei 172 2014年10月22日 发布 推荐 0 推荐 收藏 4 收藏,5.7k 浏览 ---------------- If you do NOT know Chinese, you can just skip this part ---------------- 一直打算将原来的XFace进行改进,最近终于有了些时间可以动手了,改进计划如下:开发上使用Android

白话开发——Android Studio代码调试技巧篇

Android Studio目前已经成为开发Android的主要工具,用熟了可谓相当顺手.作为开发者,调试并发现bug,进而解决,可是我们的看家本领.正所谓,工欲善其事必先利其器,和其他开发工具一样,如Eclipse.Idea,Android Studio也为我们提供了强大的调试技巧,今天我们就来看看Android Studio中有关调试的技巧. 首先,来看看Android studio中为我们提供的调试面板(标准情况下): 点击右上角Restore 'Threads'View可先展示目前相关的

动手试试Android Studio插件开发

由于业务关系,经常需要写一些表单页面,基本也就是简单的增删改查然后上传,做过几个页面之后就有点想偷懒了,这么低水平重复性的体力劳动,能不能用什么办法自动生成呢,查阅相关资料,发现android studio插件正好可以满足需求,在Github上搜了一下,找到BorePlugin这个帮助自动生成布局代码的插件挺不错的,在此基础上修改为符合自己需求的插件,整体效果还不错. 发现了android studio插件的魅力,自己也总结一下,也给小伙伴们提供一点参考,今天就以实现自动生成findviewby