文档章节

Mac Android Studio下NDK—JNI初涉

Neo_D
 Neo_D
发布于 2015/10/20 16:59
字数 1093
阅读 160
收藏 0

    今天由于后期的需求研究了一下在Android Studio下面的NDK开发流程,以前使用Eclipse的时候也搭建过这方面的东西,当时是在Window的环境下,使用的Cygwin来模拟Linux下的编译环境,步骤可能比较繁琐,这里就不介绍了,这里主要是给大家分享下Mac 下Android Studio NDK开发的基础。


1、大家Mac 下NDK的开发环境;

    首先下载对应系统的NDK开发包:http://developer.android.com/tools/sdk/ndk/index.html

    无法下载的哥们可以使用这里的百度与链接 android-ndk-r10e-darwin-x86_64.bin 

    终端打开cd 到相应的下载文件同级目录下:

Neo$ chmod a+x android-ndk-r10e-darwin-x86_64.bin
Neo$ ./android-ndk-r10c-darwin-x86_64.bin

    这样就可以在目录下看到相应的解压文件夹

    接下来配置相应的环境变量:

Neo$ cd ~
Neo$ open .bash_profile

    编辑打开的文件,追加好如下的NDK环境变量(注意路径改成自己Mac上的路径)

export PATH=${PATH}:/Users/Neo/adt-bundle/android-ndk-r10e
export NDK=/Users/Neo/adt-bundle/android-ndk-r10e

    编辑完后记得保存command+s,然后关闭文件

Neo$ source .bash_profile

    完成这些你的NDK配置就差不多了,记下来就进入我们的Android Studio模式吧!


2、Android Studio NDK配置(Mac / Android Studio 1.4)

    第一步:新建一个项目(我取名就叫NDK吧)

       

    这里先new 两个类 MainActivity 启动类,以方便我们后面看运行效果

    NavHelper 中我们定义我们JNI的接口:

public native String getTextStringFromNativate();

public native String print(String msg);

  这里只简单的演示所以随便定义了两个方法。

  第二步: 生成jni相关文件

    记住,写好代码后记得Build->Rebuild Project  这个可没有Eclipse那种及时自动保存编译哦,记得手动生成下

Neo$ cd ~/workspace/NDK/app/src/main

    还是老话,注意你自己的路径,接下来采用javah来生成C头文件

Neo$  javah -d jni -classpath ../../build/intermediates/classes/debug/ -jni dzq.ndk.NavHelper

   运行完成后,回到Android Studio下面,你会发现在main的同级目录下,生成了一个叫jni的文件夹,并生成了文件:

    dzq_ndk_NavHelper.h

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

#ifndef _Included_dzq_ndk_NavHelper
#define _Included_dzq_ndk_NavHelper
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     dzq_ndk_NavHelper
 * Method:    getTextStringFromNativate
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_dzq_ndk_NavHelper_getTextStringFromNativate
  (JNIEnv *, jobject);

/*
 * Class:     dzq_ndk_NavHelper
 * Method:    print
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_dzq_ndk_NavHelper_print
  (JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

    剩下的事情就简单了,自己新建一个c文件:main.c  来实现接口中的方法:

//
// Created by Neo  on 15/10/20.
//

#include "dzq_ndk_NavHelper.h"

JNIEXPORT jstring JNICALL Java_dzq_ndk_NavHelper_getTextStringFromNativate
        (JNIEnv * env, jobject object){
    return (*env)->NewStringUTF(env,"我来自C语言哦");

}

JNIEXPORT jstring JNICALL Java_dzq_ndk_NavHelper_print
        (JNIEnv * env, jobject object, jstring str){
    return (*env)->NewStringUTF(env,"Java_dzq_ndk_NavHelper_print");
}

   目的主要还是演示为主,具体java中的类型和C类型之间的转换可以参考 jni.h 这个头文件中的方法,jni.h 就在你的JDK目录或者你的NDK目录下都有。后续有时间的话可能会单独总结下jni.h 里面的方法吧。

第三步:编译——运行

    首先配置好Android Studio的NDK路径,打开项目根目录下 local.properties 文件,追加ndk.dir(路径!!)

ndk.dir=/Users/Neo/adt-bundle/android-ndk-r10e

    然后在app目录下的 build.gradle中设置需要生成的库文件名(生成的so文件名):

        ndk{
            moduleName "dzqJni"  //设置库(so)文件名称
        }

    注意:将这段代码加在defaultConfig 这项里面

    在NavHelper类中加载:

static {  
    System.loadLibrary("dzqJni");  
}

    最后一步的配置,打开项目根目录下面的:gradle.properties 加上以下代码

android.useDeprecatedNdk=true

   至此,我们的demo 就基本完成了,你可以在MainAcivity 新建一个TextView,去放心调用NavHelper中的方法,并显示在屏幕上效果如下:


总结下:

    相对于Eclipse来说 Android Studio的NDK配置编辑要方便很多,不需要编写Android.mk 和运行前手动去编译生成.so 再去运行我们的APP,其实AS还可以代码提示以及与java方法一一定位的功能,当然上面所分享的在Android Studio中的操作 在其余的操作系统上也一样可以借鉴的。

    不善长篇大论,就写到这了,后续有机会在和大家分享,希望大家支持原创,转载请注明出处!谢谢!

© 著作权归作者所有

共有 人打赏支持
Neo_D
粉丝 2
博文 1
码字总数 1093
作品 0
黄浦
高级程序员
私信 提问
加载中

评论(1)

Inspire7
Inspire7
不错不错,博主再接再厉,赞赞赞!!!
[Android] 环境配置之Android Studio开发NDK

======================================================== 作者:qiujuer 博客:my.oschina.net/u/1377710 网站:www.qiujuer.net 开源库:Genius-Android 转载请注明出处:http://my.osc......

Qiujuer
2014/12/21
0
8
初识 Android Native Development Kit (NDK)

Android开发者社区对JNI的呼声一直很高,这次Google发布NDK可以说是顺应民意。NDK和SDK一样提供了Linux、Windows、Mac三大开发平台的版本。 在Linux上,尤其是Debian/Ubuntu上进行安装,非常...

红薯
2009/07/03
15.1K
4
如何为Android,Mac和Windows平台创建Java JNI动态链接库

Java Native Interface (JNI) 是Java和C/C++之间的桥梁。在一些情况下,为了提高Java程序的性能,扩展Java程序的功能,我们需要使用JNI。比如数据库的调用,当我们下载一个JDBC的jar包之后,...

yushulx
2014/09/17
0
0
Android Studio之NDK环境搭建,so文件打包以及使用

本篇入门教程开发环境为mac + Android Studio + gradle 2.14.1,主要包含以下3块内容: NDK环境搭建 编写第一个JNI项目 打包出动态so文件,在其他项目中使用 一、NDK环境搭建 从Android Stu...

ljianbing
06/26
0
0
Android JNI学习(二)——实战JNI之“hello world”

本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Native相互调用 Android JNI学习(四)——JNI的常用方法...

隔壁老李头
05/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Andrew Ng教你如何引领公司进入AI时代

摘要: 人工智能时代,企业转型遇到困难?看看Andrew Ng的建议吧! AI(人工智能)技术就像100年前的电力一样,正准备改变每个行业。从现在到2030年,它将创造约13万亿美元的GDP增长。虽然它...

阿里云官方博客
4分钟前
0
0
斗图咖(www.doutuka.com)上线纪念

网站名称:斗图咖 网站描述:是一款年轻人都在玩的斗图网站,来斗图咖一起斗图装逼交朋友吧。站长每天上传收集的最新最火斗图,供大家娱乐聊天发表情;后期也会开发表情自主设计,自己设计表...

focusone
25分钟前
2
0
Spring AOP 切面编程记录日志和接口执行时间

最近客户现在提出系统访问非常慢,需要优化提升访问速度,在排查了nginx、tomcat内存和服务器负载之后,判断是数据库查询速度慢,进一步排查发现是因为部分视图和表查询特别慢导致了整个系统...

编程SHA
36分钟前
5
0
15个Spring的核心注释示例

众所周知,Spring DI和Spring IOC是Spring Framework的核心概念。让我们从org.springframework.beans.factory.annotation和org.springframework.context.annotation包中探索一些Spring核心注......

java菜分享
42分钟前
2
0
[LintCode] Binary Tree Level Order Traversal(二叉树的层次遍历)

描述 给出一棵二叉树,返回其节点值的层次遍历(逐层从左往右访问) 样例 给一棵二叉树 {3,9,20,#,#,15,7} : 3 / \9 20 / \ 15 7 返回他的分层遍历结果: [ [3], [...

honeymose
50分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部