文档章节

Mac Android Studio下NDK—JNI初涉

Neo_D
 Neo_D
发布于 2015/10/20 16:59
字数 1093
阅读 154
收藏 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,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
最新靠谱可用的 Mac 环境下 FFmpeg 环境搭建

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

光源_Android
05/13
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

没有更多内容

加载失败,请刷新页面

加载更多

DeepMind 开源图神经网络的代码

用于支持论文《Relational inductive biases, deep learning, and graph networks》。 github A graph network takes a graph as input and returns a graph as output. The input graph has......

shengjuntu
20分钟前
1
0
python2编码详解、一

以前使用python3没觉的什么,跟着公司使用python2后被编码问题折磨的痛不欲生,好好研究了一下编码问题,参考了很多博文,加入自己的理解,这里只是对编码的介绍,下一篇是python2中编码问题...

hc321
29分钟前
1
0
基于OpenSSL的一些常用加密签名算法

目前包括:MD5、SHA512、DES、RSA加解密、RSA+MD5签名验证算法,在openssl基础上再进行封装,使用简单,头文件需要包含openssl库,可以使用vcpkg自动管理,省去繁琐的配置工程的过程。 该RSA...

LoSingSang
37分钟前
1
0
spring Data JPA

什么是JPA? 全称Java Persistence API,可以通过注解或者XML描述【对象-关系表】之间的映射关系,并将实体对象持久化到数据库中。 为我们提供了: 1)ORM映射元数据:JPA支持XML和注解两种元...

狼王黄师傅
42分钟前
1
0
微信小程序 - 使用七牛云 API 截取第 n 秒图像为封面图

前面分享过七牛的上传操作,在这里说下使用七牛 api 对视频在页面的处理,比如你的视频上传之后获取七牛视频链接,这时候你怎么展示它呢? 在页面可以使用小程序提供的原生组件 video ,可以...

几个栗子
45分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部