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. Python 的PIL,可以解决ImportError The _imagingft C module is not installed

    删除PIL相关文件 mv PIL /tmp   pip install Pillow 安装Pillow后, 可能还会发生KeyError的错误, 检查项目源码后发现是 Image 模块的save函数中 ...

  2. postman使用之四:设置读取变量和切换环境

    postman提供了environment管理功能,想要在多个环境中测试,比如在测试环境.灰度环境.生产环境等,只需要用同样的接口,切换下环境即可,非常方便.具体步骤: 设置环境变量  1.点击man ...

  3. 小白jquery横向菜单弹出菜单制作

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. html+jquery+php实现文件上传全过程

    本例子采用html+jquery+php实现上传功能 html部分 <!DOCTYPE html> <html> <head> <meta charset=& ...

  5. js 页面向下滚动

    向下滚动一段距离 距离顶部距离 var scrollTop=document.documentElement.scrollTop||document.body.scrollTop; <scrip ...

  6. MariaDB 选择查询

    在本章中,我们将学习如何从表中选择数据. SELECT语句检索所选行. 它们可以包括UNION语句,排序子句,LIMIT子句,WHERE子句,GROUP BY ... HAVING子句和子查询. 查看 ...

  7. ps查看和调整优先级

    主题ps查看和调整优先级 一查看优先级 nice值越大优先级越低 [root@centos72 ~]# ps axo pid,cmd,ni | head PID CMD NI 1 /usr/lib/s ...

  8. 因为看见,所以发现:QBotVariant谢绝落幕

    互联网给人带来便捷的同时,其公开大量的资源也同样给恶意利用者带了便捷,越来越多公开的恶意程序源码降低了对外攻击.入侵的难度,使得安全问题愈加严重. 阿里云安全团队从今年5月份监测到一BOT家族,其样本 ...

  9. RBAC权限设计(一)

    序言 RBAC表结构 用户表 角色表 权限表 用户角色(关系)表 角色权限(关系)表 sql脚本 /* Navicat MySQL Data Transfer Source Server : 127. ...

  10. 容器————priority_queue

    #include <queue> 与queue不同的是可以自定义其中数据的优先级,让优先级高的先出队列. 优先队列具有队列的所有特性,包括基本操作,只是在这基础上添加了内部的一个排序,它本 ...