文档章节

Mac Android Studio下NDK—JNI初涉

Neo_D
 Neo_D
发布于 2015/10/20 16:59
字数 1093
阅读 141
收藏 0
点赞 1
评论 1

    今天由于后期的需求研究了一下在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 JNI学习(二)——实战JNI之“hello world”

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

隔壁老李头 ⋅ 05/09 ⋅ 0

最新靠谱可用的 Mac 环境下 FFmpeg 环境搭建

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

光源_Android ⋅ 05/13 ⋅ 0

Android JNI(一)——NDK与JNI基础

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

隔壁老李头 ⋅ 05/09 ⋅ 0

用Android Studio进行NDK编程入门实例

参考了网上各种教程,跌跌撞撞最终才把流程走通,特此记录一下: 有必要先交代下开发环境: 操作系统:Win7 Android Studio 3.0.1 gradle 3.0.1 首先,新建一个Android项目,然后在MainActiv...

analogous_love ⋅ 04/17 ⋅ 0

Android 网络编程 目录

Android 网络编程 目录 Android 网络编程1 Http协议 to be continued... Android 架构师之路 目录 Android 架构师之路1 UML图之用例图 Android 架构师之路2 UML图之类图 Android 架构师之路3...

香沙小熊 ⋅ 06/21 ⋅ 0

解决JNI在Windows环境下因长路径导致编译失败问题

之前听一个朋友反馈LuaScriptoCore在Windows下编译会报错,今天特意跑到Windows环境下测试了一番,果然是存在问题。得到了下面的编译报错信息: Build command failed. Error while executin...

杰嗒嗒的阿杰 ⋅ 05/04 ⋅ 0

Cocos2d-x 2.2.3 使用NDK配置编译环境

https://blog.csdn.net/wwj_748/article/details/30072379 2014年6月11日 Cocos2d-x 3.0以下的开发环境的配置恐怕折磨了很多人,使用cygwin配置编译环境足够让初学者蛋疼一阵子了。本篇博客就...

tropicofcancer9 ⋅ 04/19 ⋅ 0

Android开发--NDK之环境搭建

android 中为什么实用NDK,网上一搜一大堆,在这原因不在赘述。 在Android SDK首次发布时,Google就宣称其虚拟机Dalvik是支持JNI编程方式的;也就是第三方的应用是可以调用自己公司的或者是其...

墨宇hz ⋅ 2016/07/11 ⋅ 0

Android NDK开发的一点尝试

写在前面 笔者是一个“原始”的C++开发者,对Java编程虽说不上抵触但也没有C++那么顺手。而且,作为一个游戏引擎,不管是在什么地方,效率总是第一位的,尤其是在移动平台这样资源吃紧的环境...

闪电的蓝熊猫 ⋅ 04/06 ⋅ 0

使用Android Studio编译cocos2dx的测试用例

最近笔者在学习如何为游戏引擎添加Android平台的支持。首先从已有的游戏引擎开始研究,将引擎中的示例用Android Studio打包成apk文件。笔者选用了目前风头正紧的cocos2dx,版本是最新的3.16,...

闪电的蓝熊猫 ⋅ 04/06 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

使用 vue-cli 搭建项目

vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目,GitHub地址是:https://github.com/vuejs/vue-cli 一、 安装 node.js 首先需要安装node环境,可以直接到中...

初学者的优化 ⋅ 9分钟前 ⋅ 0

设计模式 之 享元模式

设计模式 之 享元模式 定义 使用共享技术来有效地支持大量细粒度对象的复用 关键点:防止类多次创建,造成内存溢出; 使用享元模式来将内部状态与外部状态进行分离,在循环创建对象的环境下,...

GMarshal ⋅ 24分钟前 ⋅ 0

SpringBoot集成Druid的最简单的小示例

参考网页 https://blog.csdn.net/king_is_everyone/article/details/53098350 建立maven工程 Pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM......

karma123 ⋅ 今天 ⋅ 0

Java虚拟机基本结构的简单记忆

Java堆:一般是放置实例化的对象的地方,堆分新生代和老年代空间,不断未被回收的对象越老,被放入老年代空间。分配最大堆空间:-Xmx 分配初始堆空间:-Xms,分配新生代空间:-Xmn,新生代的大小一...

算法之名 ⋅ 今天 ⋅ 0

OSChina 周日乱弹 —— 这么好的姑娘都不要了啊

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @TigaPile :分享曾惜的单曲《讲真的》 《讲真的》- 曾惜 手机党少年们想听歌,请使劲儿戳(这里) @首席搬砖工程师 :怎样约女孩子出来吃饭,...

小小编辑 ⋅ 今天 ⋅ 8

Jenkins实践3 之脚本

#!/bin/sh# export PROJ_PATH=项目路径# export TOMCAT_PATH=tomcat路径killTomcat(){pid=`ps -ef | grep tomcat | grep java|awk '{print $2}'`echo "tom...

晨猫 ⋅ 今天 ⋅ 0

Spring Bean的生命周期

前言 Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。 首先看下生命周期图: 再谈生命周期之前有一点需要先明确: Spring 只帮我们管理单例模...

素雷 ⋅ 今天 ⋅ 0

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 今天 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部