AndroidStudio2.0搭建Ndk环境&成功编译使用

现在使用Ndk开发的场景还蛮多,游戏引擎、音视频开发等都能涉及到,以前的工程大部分都是Eclipse的工程目录,但是App开发现在大部分都是在AndroidStudio开发工具中进行的,那就有个问题了?怎么在As中搭建Ndk的环境呢。这就是本篇文章所要解答的,并且会创建一个小例子,编译成.so文件,且在项目中使用。Come on….

在没具体动手之前我们想一想怎么实现比较好吧,假如我们新建一个As2.0的工程,然后按照他的目录结构把jni层文件放到指定的目录下,然后进行开发,固然可行,可行是可行,但是代价就是Sdk开发和Ndk开发就分离了,不在一个工程目录下,不符合我们的预期,那就换种思路吧。庆幸的是,As的gradle脚本功能比较强大,可以指定源码文件,操作任务等。如果只是修改一下配置文件,就把事情给做好了,那岂不是皆大欢喜。好吧 开始做了。

首先在工程Module的src目录下新建一个jni目录(存放我们的c、c++源码及mk文件)

然后最关键的是要在build.gradle配置一下说明jni里面的代码是咱们的ndk编译代码位置,及做一些编译任务的处理 下面配置代码由 成都 小妖 提供,特别感谢他

task buildNative(type: Exec, description: ‘Compile JNI source via NDK‘) {
    def ndkDir = android.ndkDirectory

    if (Os.isFamily(Os.FAMILY_WINDOWS)) {
        commandLine "$ndkDir/ndk-build.cmd",
                ‘-C‘, file(‘src/jni‘).absolutePath, // Change src/main/jni the relative path to your jni source
                ‘-j‘, Runtime.runtime.availableProcessors(),
                ‘all‘,
                ‘NDK_DEBUG=1‘
    } else {
        commandLine "$ndkDir/ndk-build",
                ‘-C‘, file(‘src/jni‘).absolutePath, // Change src/main/jni the relative path to your jni source
                ‘-j‘, Runtime.runtime.availableProcessors(),
                ‘all‘,
                ‘NDK_DEBUG=1‘
    }
}
//在 mac 中 commandLine "$ndkDir/ndk-build", 但是在windows中 commandLine "$ndkDir/ndk-build.cmd",额,坑
//
task cleanNative(type: Exec, description: ‘Clean JNI object files‘) {
    def ndkDir = android.ndkDirectory
    if (Os.isFamily(Os.FAMILY_WINDOWS)) {
        commandLine "$ndkDir/ndk-build.cmd",
                ‘-C‘, file(‘src/jni‘).absolutePath, // Change src/main/jni the relative path to your jni source
                ‘clean‘
    } else {
        commandLine "$ndkDir/ndk-build.cmd",
                ‘-C‘, file(‘src/jni‘).absolutePath, // Change src/main/jni the relative path to your jni source
                ‘clean‘
    }
}
//
clean.dependsOn ‘cleanNative‘

tasks.withType(JavaCompile) {
    compileTask -> compileTask.dependsOn buildNative
}

注意上面的有一个变化的地方就是jni的路径在哪,src/jni 如果跟我不一样的,应该写你的具体位置

然后在我们的代码中添加一个Native方法,就让他打印一个helloworld吧

public native void printHelloworld();

然后使用javah命令 生成对应的.h头文件

这样会在下面目录生成2个文件,当然下面的那个文件不用管它了

然后把生成的这俩文件放到刚才创建的jni里面

下面就是编写cpp文件Android.mk Application.mk文件了

.h文件代码

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_qbao_ticket_MainActivity */

#ifndef _Included_com_qbao_ticket_MainActivity
#define _Included_com_qbao_ticket_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_qbao_ticket_MainActivity
 * Method:    add
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_qbao_ticket_MainActivity_printHelloworld
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

.cpp文件代码

#include <jni.h>
#include <android/log.h>
#include "com_qbao_ticket_MainActivity.h"
#define LOG_TAG "System.out.c"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)

JNIEXPORT void JNICALL Java_com_qbao_ticket_MainActivity_printHelloworld
  (JNIEnv *, jobject){
  LOGI("hello world! come from jni");
}

注意新建写的时候 一定要加上

#include "com_qbao_ticket_MainActivity.h"

然后写咱们的mk文件,先来Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := lalala

LOCAL_SRC_FILES := com_qbao_ticket_MainActivity.cpp

LOCAL_LDLIBS += -llog

include $(BUILD_SHARED_LIBRARY)

要改的地方是咱们的module名称源文件列表 这里根据自己的代码设置就好了

接下来Application.mk

APP_ABI := all
APP_PLATFORM := android-8

设置了全平台,当然不设置也可以 默认就行了

点击这个按钮 开始编译

编译成功会在src目录下生成一个libs和obj.local目录

然后就生成了咱们命名的liblalala.so文件 格式为lib{模块名}.so

下面是怎么在代码中使用咱们生成的.so文件了

把我们的编译生成好的.so文件拷贝到代码的libs中armeabi目录下

然后是在我们的代码中使用它

static {
   System.loadLibrary("lalala");
}
public native  void printHelloworld();

注意load的时候写模块名 不是文件名 这里是lalala 然后在MainActivity里面调用这个printHelloworld方法

打印一下log

好了到这里在As2.0中搭建Ndk环境并且编译so文件,并使用so文件的介绍已经讲完了,后面会在这个基础上编译一些音视频模块的代码,然后封装使用。期待吧。。。

build.gradle全部配置查看

import org.apache.tools.ant.taskdefs.condition.Os

apply plugin: ‘com.android.application‘

dependencies {
    compile fileTree(dir: ‘libs‘, include: ‘*.jar‘)
}

android {
    compileSdkVersion 21
    buildToolsVersion "22.0.1"
    sourceSets {
        main {
            manifest.srcFile ‘AndroidManifest.xml‘
            java.srcDirs = [‘src‘]
            resources.srcDirs = [‘src‘]
            aidl.srcDirs = [‘src‘]
            renderscript.srcDirs = [‘src‘]
            res.srcDirs = [‘res‘]
            assets.srcDirs = [‘assets‘]
            jniLibs.srcDirs = [‘libs‘]
        }

        // Move the tests to tests/java, tests/res, etc...
        instrumentTest.setRoot(‘tests‘)

        // Move the build types to build-types/<type>
        // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
        // This moves them out of them default location under src/<type>/... which would
        // conflict with src/ being used by the main source set.
        // Adding new build types or product flavors should be accompanied
        // by a similar customization.
        debug.setRoot(‘build-types/debug‘)
        release.setRoot(‘build-types/release‘)
    }
    buildTypes {
        debug {
            //proguardFile ‘/Users/xuchuang/Desktop/Stifler/WorkSpace/QBaoTicket_2.0/qbaoticket_2.0/proguard-project.txt‘
            //signingConfig signingConfigs.qbaoticket
        }
        release {
            //signingConfig signingConfigs.qbaoticket
            //minifyEnabled true
            //proguardFile ‘/Users/xuchuang/Desktop/Stifler/WorkSpace/QBaoTicket_2.0/qbaoticket_2.0/proguard-project.txt‘
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }
    dexOptions {
        jumboMode true
    }
}

task buildNative(type: Exec, description: ‘Compile JNI source via NDK‘) {
    def ndkDir = android.ndkDirectory

    if (Os.isFamily(Os.FAMILY_WINDOWS)) {
        commandLine "$ndkDir/ndk-build.cmd",
                ‘-C‘, file(‘src/jni‘).absolutePath, // Change src/main/jni the relative path to your jni source
                ‘-j‘, Runtime.runtime.availableProcessors(),
                ‘all‘,
                ‘NDK_DEBUG=1‘
    } else {
        commandLine "$ndkDir/ndk-build",
                ‘-C‘, file(‘src/jni‘).absolutePath, // Change src/main/jni the relative path to your jni source
                ‘-j‘, Runtime.runtime.availableProcessors(),
                ‘all‘,
                ‘NDK_DEBUG=1‘
    }
}
//在 mac 中 commandLine "$ndkDir/ndk-build", 但是在windows中 commandLine "$ndkDir/ndk-build.cmd",额,坑
//
task cleanNative(type: Exec, description: ‘Clean JNI object files‘) {
    def ndkDir = android.ndkDirectory
    if (Os.isFamily(Os.FAMILY_WINDOWS)) {
        commandLine "$ndkDir/ndk-build.cmd",
                ‘-C‘, file(‘src/jni‘).absolutePath, // Change src/main/jni the relative path to your jni source
                ‘clean‘
    } else {
        commandLine "$ndkDir/ndk-build.cmd",
                ‘-C‘, file(‘src/jni‘).absolutePath, // Change src/main/jni the relative path to your jni source
                ‘clean‘
    }
}
//
clean.dependsOn ‘cleanNative‘

tasks.withType(JavaCompile) {
    compileTask -> compileTask.dependsOn buildNative
}

参考资料

http://blog.csdn.net/allen315410/article/details/41805719

支持原创 from 爆发的妞 qq 928320442

时间: 2024-10-05 08:11:03

AndroidStudio2.0搭建Ndk环境&成功编译使用的相关文章

Android Gradle编译学习日记之一(搭建 Gradle 环境以及编译 Android 应用)

大家如果喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 Google 在最近正式推出了 Android Studio 1.0版本,开发者首页的默认开发工具也已经更改成了 Android Studio,我想我们是时候全面转型到 Android Studio 开发了. 其实抛开界面因素,Android Studio 与 Eclipse ADT 构建 Android

Windows7系统下OpenCV2.4.4+PCL1.6.0+SSBA3.0+VS2010 IDE32环境下编译和安装以实现Sfm和PCL点云数据可视化

最近在学习<深入理解OpenCV:实用计算机视觉项目解析>一书的第三章和第四章时,遇到很多编译问题,书中又没有详细的讲解环境配置和搭建过程.经过多天的捉摸.调试.排错终于将两章的程序都调试成功了,先做个记录以备忘.概述的英文名为:<Mastering OpenCV with Practical Computer Vision Projects>. 一.开发环境概述 1.OpenCV版本:2.4.4: 2.PCL版本:1.6.0: 3.SSBA版本:3.0: 4.IDE版本:VS20

CentOS 7.0 搭建LAMP环境

一.apache.php.mysql安装 安装顺序:apache/mysql    最后安装php   前两者顺序无所谓. 1.安装apache 需要服务器联网 安装:yum install -y httpd 运行:/bin/systemctl start httpd.service 执行完运行命令之后是看不到效果的,这时候再输入查看apache服务状态命令来查看服务是否已经启动: 查看状态:service httpd status Apache开启服务:systemctl start http

android studio2.0 搭建Robotium环境--apk测试没有混淆只有签名

1.配置好android sdk ,java环境 2.重新签名apk文件 在用户目录下,会有一个.android的目录,把re-sign.jar放在该目录下.执行命令 java -jar re-sign.jar 即可 再把apk文件脱到打开的re-sign上.保存重新签名后的文件.     遇到问题:提示sdk\tools\zipalign.exe没有这个文件.解决:拷贝一份到这个目录下 3.将生成的debug文件安装到夜神模拟器中 adb connect 127.0.0.1:62001adb

android studio2.0 搭建Robotium环境--eclipse--apk 环境搭建

1.配置好android sdk ,java环境 2.重新签名apk文件 在用户目录下,会有一个.android的目录,把re-sign.jar放在该目录下.执行命令 java -jar re-sign.jar 即可 再把apk文件脱到打开的re-sign上.保存重新签名后的文件. 注意,弹出的如下需要截图,后面会用到. 也可以用脚本直接操作.bat脚本如下 bat脚本和re-sign.jar再同一个目录下. @echo off echo "你的.android目录为:" echo %

Centos7.0 搭建Zabbix环境

实验环境:Centos7.0 IP:192.168.47.140 关闭iptables及setenforce 导入源 rpm -ivh http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm 安装zabbix包 安装完成 安装mysql源 wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm rpm -i

eclipse里配置Android ndk环境,用eclipse编译.so文件

做Android NDK开发时,c代码需要用ndk-build来进行编译,而java代码则需要用Android sdk编译. 编译c代码有两种方法: 一.写好c代码后,然后用cygwin搭建ndk-build环境,用ndk-build来编译出相关的.so文件(libs目录)之后, 再用eclipse里去编译java程序,从而使用.so文件.该方法在上一篇搭建NDK环境有介绍. 二.利用eclipse完全可以达到编译.so的目的. 首先,先装上CDT吧,这是Eclipse的C/C++环境插件,装上

unbuntu 14.04下NDK环境的搭建以及无法设置NDK路径的解决方案

最近在unbuntu中搭建android环境,在搭建ndk环境的时候遇到了问题,发现最后无法设置NDK的路径. 首先,还是先进行ndk环境的搭建.(已经事先搭建好了JDK环境,需要搭建JDK环境的可以参考JDK环境的搭建) 1.下载需要的NDK,笔者是unbuntu 14.04 64位的版本. 这里推荐一个android中国镜像,由于访问android官网的速度很慢,下载速度....踏得网 使用中国镜像速度就快多了. 选择我们需要的版本进行下载: 这里我下载的是最后一个. 2.直接点击提取把全部

3、Cocos2dx 3.0游戏开发找小三之搭建开发环境

尊重开发人员的劳动成果.转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27107295 搭建开发环境 使用 Cocos2d-x 的一个非常大便利之处在于,我们能够在 PC 或 Mac 环境下完毕编码和大部分的调试,然后再迁移到其它设备 上做实际环境測试.这意味着我们能够在 PC 上开发游戏.然后以极其低廉的成本把游戏迁移到 iOS 或其它平台上,从而节 省了开发阶段支付在设备方面的很多费用. 前面提到,Cocos2d-x