文档章节

Mac Android Studio下NDK—JNI初涉

Neo_D
 Neo_D
发布于 2015/10/20 16:59
字数 1093
阅读 145
收藏 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 Studio之NDK环境搭建,so文件打包以及使用

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

ljianbing
06/26
0
0
如何为Android,Mac和Windows平台创建Java JNI动态链接库

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

yushulx
2014/09/17
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
最新靠谱可用的 Mac 环境下 FFmpeg 环境搭建

大家好,我是光源。 最近在尝试搭建 FFmpeg 开发环境时遇到一个蛋疼的事,Google 了 N 篇文章竟然没有一篇是可以跑起来的! 少部分教程是给出了自我矛盾的配置(是的,按照贴出来的代码和配置...

光源_Android
05/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

深夜胡思乱想

魔兽世界 最近魔兽世界出了新版本, 周末两天升到了满级,比之前的版本体验好很多,做任务不用抢怪了,不用组队打怪也是共享拾取的。技能简化了很多,哪个亮按哪个。 运维 服务器 产品 之间的...

Firxiao
13分钟前
0
0
MySQL 8 在 Windows 下安装及使用

MySQL 8 带来了全新的体验,比如支持 NoSQL、JSON 等,拥有比 MySQL 5.7 两倍以上的性能提升。本文讲解如何在 Windows 下安装 MySQL 8,以及基本的 MySQL 用法。 下载 下载地址 https://dev....

waylau
46分钟前
0
0
微信第三方平台 access_token is invalid or not latest

微信第三方开发平台code换session_key说的特别容易,但是我一使用就带来无穷无尽的烦恼,搞了一整天也无济于事. 现在记录一下解决问题的过程,方便后来人参考. 我遇到的这个问题搜索了整个网络也...

自由的开源
今天
0
0
openJDK之sun.misc.Unsafe类CAS底层实现

注:这篇文章参考了https://www.cnblogs.com/snowater/p/8303698.html 1.sun.misc.Unsafe中CAS方法 在sun.misc.Unsafe中CAS方法如下: compareAndSwapObject(java.lang.Object arg0, long a......

汉斯-冯-拉特
今天
2
0
设计模式之五 责任链模式(Chain of Responsibility)

一. 场景 相信我们都有过这样的经历; 我们去职能部门办理一个事情,先去了A部门,到了地方被告知这件事情由B部门处理; 当我们到了B部门的时候,又被告知这件事情已经移交给了C部门处理; ...

JackieRiver
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部