NDK开发,其实是为了项目需要调用底层的一些C/C++的一些东西;另外就是为了效率更加高些。如果你在Eclipse+ADT下开发过NDK就能体会到要么是配置NDK还要下载Cygwin,配置Cygwin ,然后需要编译生成,相当的蛋疼。

在AS中新建一个Project,然后再新建一个class为TestHello,在内部声明native方法(jni使用的定义,后面系列教程会细说)。

public class TestHello {
public native static String getCLanguageString(); }

在工程主文件Activity中写入如下代码调运JNI的东西显示在UI上。

package com.otherway.myapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast; public class MainActivity extends AppCompatActivity { private Toast mToast; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); mToast = Toast.makeText(this, "", Toast.LENGTH_SHORT); showTip(TestHello.getCLanguageString());
} private void showTip(final String str) {
mToast.setText(str);
mToast.show();
} }

然后build project得到其中中间文件,我们关注的是.class文件。编译OK以后生成的class文件在AS工程的如下目录:

app/build/intermediates/classes/debug

然后接下来的步骤就是根据生成的class文件,利用javah生成对应的 .h头文件。

点开AS的Terminal标签,默认进入到该项目的app文件夹下。我在ubuntu平台下输入如下命令跳转到class中间文件生成路径:

cd app/build/intermediates/classes/debug/

然后执行如下javah命令生成h文件。

xxxxx\debug> javah -jni com.otherway.myapplication.TestHello

执行完之后你可以在文件夹app/build/intermediates/classes/debug/下看见生成的 .h头文件为:

com_otherway_myapplication_TestHello.h

其内容为:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_otherway_myapplication_TestHello */ #ifndef _Included_com_otherway_myapplication_TestHello
#define _Included_com_otherway_myapplication_TestHello
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_otherway_myapplication_TestHello
* Method: getCLanguageString
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_otherway_myapplication_TestHello_getCLanguageString
(JNIEnv *, jclass); #ifdef __cplusplus
}
#endif
#endif

在工程的main目录下新建一个名字为jni的目录,然后将刚才的 .h文件剪切过来。在jni目录下新建一个c文件,随意取名,我的叫TestHello.c 。然后编辑代码如下(后面会解释啥意思,这里重在工具使用):

#include "com_otherway_myapplication_TestHello.h"
/*
* Class: com_otherway_myapplication_TestHello
* Method: getCLanguageString
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_otherway_myapplication_TestHello_getCLanguageString
(JNIEnv *, jclass){
return (*env)->NewStringUTF(env," Android Studio NDK JNI Hello");
}

接下来在工程的local.properties文件中添加NDK路径(上面下载好的那个NDK),类似其中的SDK路径一样,我的添加后如下:

ndk.dir=/home/cam/Android/Sdk/ndk-bundle
sdk.dir=/home/cam/Android/Sdk

接下来在app module目录下的build.gradle中设置库文件名(生成的so文件名)。找到gradle文件的defaultConfig这项,在里面添加如下内容:

    defaultConfig {

        ndk {
moduleName "testhello"
ldLibs "log", "z", "m" //添加依赖库文件,因为有log打印等
}
}

现在生成的so库名字也有了,那就去代码的TestHello java文件添加静态初始化load代码,添加如下:

    static {
try {
System.loadLibrary("testhello");
} catch (Exception e) {
e.printStackTrace();
}
}

好了,到此AS下NDK JNI开发的代码编写和设置就OK了,接下来就是编译工程运行就可以了。

JNI 在Android Studio利用NDK编译运行一个简单的c库的更多相关文章

  1. android studio笔记之编译运行错误

    错误类型: Error:java.lang.UnsupportedClassVersionError: com/android/dx/command/Main : Unsupported major错 ...

  2. ubuntu下code::blocks编译运行一个简单的gtk+2.0项目

    在具体的操作之前,首先需要安装一些必要的软件.ubuntu下默认安装了gcc,不过缺少必要的Header file,可以在命令行中输入下面的指令安装build-essential套件:sudo apt ...

  3. ubuntu下使用code::blocks编译运行一个简单的gtk+2.0项目

    在具体的操作之前,首先需要安装一些必要的软件.ubuntu下默认安装了gcc,不过缺少必要的Header file,可以在命令行中输入下面的指令安装build-essential套件:sudo apt ...

  4. android studio 使用ndk编译.C文件生成so文件

    task buildSo(type: Exec) { //windows commandLine 'ndk-build.cmd', '-C', file('src/main').absolutePat ...

  5. Android studio 使用NDK工具实现JNI编程

    前言: Android开发中常常会使用到第三方的.so库.在使用.so库的时候就要用到JNI编程.JNI是Java Native Interface的缩写.它提供了若干的API实现了Java和其它语言 ...

  6. 【Android Studio安装部署系列】二十五、Android studio使用NDK生成so文件和arr文件

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 Android Studio使用ndk的简单步骤. NDK环境搭建 下载NDK 下载链接:https://developer.and ...

  7. Android Studio 之 NDK篇

    由于工作内容的关系,对于NDK的工作涉及比较广(保密性,安全性),所以本章内容讲述一下NDK的基本使用过程. 网上也有很多这样的教程或者描述,但描述的并不完全 开发工具:Android Studio ...

  8. studio_ 优化Android Studio 启动、编译和运行速度?

    http://www.admin10000.com/document/6842.html: 作为一名 Android 程序员,选择一个好的 IDE 工具可以使开发变得非常高效,很多程序员喜欢使用 Go ...

  9. 如何优化 Android Studio 启动、编译和运行速度?

    作为一名 Android 程序员,选择一个好的 IDE 工具可以使开发变得非常高效,很多程序员喜欢使用 Google 的 Android Studio来进行开发,但使用起来有时会出现卡顿等问题.本文介 ...

随机推荐

  1. Jquery的$.ajax、$.get、$.post发送、接收JSON数据及回调函数用法

    平时研究代码时,经常会遇到AJAX的相关用法,做项目时才真正体会到Ajax的强大之处(与服务器数据交互如此之便捷,更新DOM节点而不用刷新整个页面),以及运用的频繁程度.今天整理了一下自己之前没搞清楚 ...

  2. redis系统管理命令

    exists 和 del exists key:判断一个key是否存在,存在返回1,否则返回0. del key:删除某个key,或是一系列key type 和 keys type key:返回某个k ...

  3. shell unique

    由于uniq命令只能对相邻行进行去重复操作,所以在进行去重前,先要对文本行进行排序,使重复行集中到一起 1.文本行去重 (1)排序由于uniq命令只能对相邻行进行去重复操作,所以在进行去重前,先要对文 ...

  4. Java高频经典面试题(第一季)一:自增的分析

    package will01; public class testZiZeng { public static void main(String[] args) { int i = 1; i = i ...

  5. 使用 jQuery 实现当前页面高亮显示的通栏导航条

    index.html <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> ...

  6. 简易的Master-Worker框架

    Master-Worker模式是一种使用多线程进行数据处理的结构,多个worker进程协作处理用户请求,master进程负责维护worker进程,并整合最终处理结果 主要参与者 Worker:用于实际 ...

  7. 06.yield

    Thread.yield()方法的作用:暂停当前正在执行的线程,并执行其他线程.(可能没有效果) yield()让当前正在运行的线程回到可运行状态,以允许具有相同优先级的其他线程获得运行的机会.因此, ...

  8. 记录 SpringBoot 踩坑经历

    1.spring-boot-starter-web 作用 <dependency> <groupId>org.springframework.boot</groupId& ...

  9. POJ 3414 Pots (dfs,这个代码好长啊QAQ)

    Description You are given two pots, having the volume of A and B liters respectively. The following ...

  10. bind-dns服务器搭建

    环境:主服务器上IP为192.168.159.30 安装相关包bind dns服务器  bind-utils提供nslookup dig等命令 yum -y install bind bind-uti ...