介绍

The NDK is a toolset that allows you to implement parts of your app using native-code languages such as C and C++. For certain types of apps, this can be helpful so you can reuse existing code libraries written in these languages, but most apps do not need the Android NDK.

Before downloading the NDK, you should understand that the NDK will not benefit most apps. As a developer, you need to balance its benefits against its drawbacks. Notably, using native code on Android generally does not result in a noticable performance improvement, but it always increases your app complexity. In general, you should only use the NDK if it is essential to your app—never because you simply prefer to program in C/C++.

配置

  1. SDK Tool中安装Ndk

  2. 设置”Android NDK ocation”,若为自动下载,应该就是在SDK目录下

  3. 新建JNI目录(src/main/jni),并且在build.gradle下添加ndk内容 defaultConfig {

    applicationId “mraz.com.jnidemo”

    minSdkVersion 15

    targetSdkVersion 24

    versionCode 1

    versionName “1.0”

    ndk {

    moduleName ‘jniTest’//这里就是生成so的模块名,也就是libjniTest.so

    }

    }

  4. Rebuild Project之后出现如下错误,则需要在gradle.properties中设置”android.useDeprecatedNdk=true”

  5. 新建一个Java类

实际使用

经过上面的步骤,我们创建一个java类,其中定义两个native方法

JniTest.java

package mraz.com.jnidemo;
public class JniTest {
static {
System.loadLibrary("jniTest");
}
public native String getHello();
public native int getSum(int a , int b);
}

首先,我们需要生成这个类对应的native代码中的头文件,使用javah



在Android Studio中使用Terminal,具有tab键联想功能

以Demo为例,生成对应的头文件到jni目录下:

javah -d app\src\main\jni

-classpath app\build\intermediates\classes\debug mraz.com.jnidemo.JniTest

生成头文件

mraz_com_jnidemo_JniTest.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class mraz_com_jnidemo_JniTest */ #ifndef _Included_mraz_com_jnidemo_JniTest
#define _Included_mraz_com_jnidemo_JniTest
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: mraz_com_jnidemo_JniTest
* Method: getHello
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_mraz_com_jnidemo_JniTest_getHello
(JNIEnv *env, jobject object); /*
* Class: mraz_com_jnidemo_JniTest
* Method: getSum
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_mraz_com_jnidemo_JniTest_getSum
(JNIEnv *env, jobject object, jint a, jint b); #ifdef __cplusplus
}
#endif
#endif

然后在JNI目录下创建对应的源文件mraz_com_jnidemo_JniTest.c

具体实现如下:

#include "mraz_com_jnidemo_JniTest.h"
#include<jni.h>
//
// Created by Mraz on 2016/6/28.
//
JNIEXPORT jstring JNICALL Java_mraz_com_jnidemo_JniTest_getHello(JNIEnv *env, jobject object)
{
return (*env)->NewStringUTF(env, "hello");
} /*
* Class: mraz_com_jnidemo_JniTest
* Method: getSum
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_mraz_com_jnidemo_JniTest_getSum
(JNIEnv *env, jobject object, jint a, jint b) {
return (a + b);
}

对应java类JniTest.java,加载so,定义native方法

package mraz.com.jnidemo;
/**
* Created by Mraz on 2016/6/28.
*/
public class JniTest {
static {
System.loadLibrary("jniTest");
}
public native String getHello();
public native int getSum(int a , int b);
}

MainActivity.java中使用JniTest.java

package mraz.com.jnidemo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.TextView; public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); JniTest jniTest = new JniTest();
Log.e("yidong", " hello = " + jniTest.getHello());
Log.e("yidong", " sum = " + jniTest.getSum(4, 6));
TextView textView = (TextView) findViewById(R.id.tv_jni);
textView.setText(String.valueOf(jniTest.getSum(5, 6)));
}
}

实际结果

备注:

刚开始接触NDK的内容,慢慢上手,点滴记录~

<Android 基础(九)> Ndk配置与Demo的更多相关文章

  1. Mac下Android studio 之NDK配置教程(一)

    Mac下Android studio 之NDK配置教程(一) 1.概述 近期项目全线转移到Mac下使用使用Android studio开发. 遇到关键代码封装到 ***native***层,此时在wi ...

  2. Android基础之退出应用程序Demo

    对于Android我也不是很熟悉,只是学习一些基本内容就OK.所以写的内容也很简单.本Demo要实现的效果就是双击返回键弹出提示框确认是否退出程序. 一.废话少说直接上代码.至于涉及到的相关包在Ecl ...

  3. [ 转载 ] Android JNI(一)——NDK与JNI基础

    Android JNI(一)——NDK与JNI基础 隔壁老李头 关注  4.4 2018.05.09 17:15* 字数 5481 阅读 11468评论 8喜欢 140 本系列文章如下: Androi ...

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

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  5. 【OpenCV for Android】Android Studio JNI和NDK配置及采坑记录

    在配置好Android studio的OpenCV环境后,我们就可以通过Java代码调用OpenCV的API了,但是在通常情况下,用Java代码编写图像处理算法的运行效率是没有C++代码高的,在应用层 ...

  6. Ubuntu NDK配置与JNI demo

    NDK配置 1.下载最新版本NDK(android-ndk-r9d-linux-x86_64.tar.bz2) 下载网页:http://developer.android.com/tools/sdk/ ...

  7. android -------- Eclipse下的NDK配置环境

    NDK 全称是Native Development Kit,是一个让开发人员在Android应用中嵌入使用本地代码编写的组件的工具集 原生开发工具包 (NDK) 是一组可让您在 Android 应用中 ...

  8. Android基础新手教程——1.6 .9(九妹)图片怎么玩

    Android基础新手教程--1.6 .9(九妹)图片怎么玩 标签(空格分隔): Android基础新手教程 1.本节引言: 可能有的一些疑问: 1.什么是.9图片? 答:图片后缀名前有.9的图片,如 ...

  9. 使用Android Studo开发NDK之Gradle的配置(能debug C代码)

    配置: 用的版本号是AS1.5(也能够尝试更高版本号). Gradle地址是distributionUrl=https\://services.gradle.org/distributions/gra ...

随机推荐

  1. matplotlib类

    1.plt.subplot 在matplotlib下,一个Figure对象可以包含多个子图(Axes),可以使用subplot()快速绘制,其调用形式如下:subplot(numRows, numCo ...

  2. 《Professional JavaScript for Web Developers》day03

    <Professional JavaScript for Web Developers>day03 1.1ECMAScript语法 1.1.1 区分大小写 1.1.2 标识符 按照惯例,E ...

  3. Luogu P4095 [HEOI2013]Eden 的新背包问题 思维/动规

    当时一直在想前缀和...多亏张队提醒... 从1到n背次包,保存每一个状态下的价值,就是不要把第一维压掉:再从n到1背一次,同样记住每种状态: 然后询问时相当于是max(前缀+后缀),当然前缀后缀中间 ...

  4. Spring Boot学习资料汇总

    1. SpringFramework 重点学习 IOC容器,Web MVC framework,AOP 等    官网文档  http://docs.spring.io/spring/docs/cur ...

  5. WebService、WCF、WebAPI、MVC的区别

    Web Service 1.它是基于SOAP协议的,数据格式是XML 2.只支持HTTP协议 3.它不是开源的,但可以被任意一个了解XML的人使用 4.它只能部署在IIS上 WCF 1.这个也是基于S ...

  6. Zabbix sql注入漏洞脚本执行反弹shell

    exp检测是否存在SQL注入漏洞root@ubuntu:~# python zabbix.py http://ip:9090/+------------------------------------ ...

  7. Linux防火墙配置学习记录

    一.iptables基本原理 1.iptables是一个管理内核包过滤的工具,包含4个表,5个链 表和链被称为Netfilter模块的两个维度, 表提供特定的功能内置四个表: filter表:用于对数 ...

  8. tomcat异常[1]--java.lang.ClassNotFoundException: XXXX.EncodingFilter

    EncodingFilter类在java项目中,确实存在,但是启动项目时,总是说找不到这个类. 后来想了一下,项目运行取的应该是项目WEB-INF/classes下面已经编译为.class文件的类文件 ...

  9. 硬盘和显卡的访问与控制(三)——《x86汇编语言:从实模式到保护模式》读书笔记03

    上一篇博文我们用了很大的篇幅说了加载器,这一篇我们该说说用户程序了. 先看作者的源码吧. ;代码清单8-2 ;文件名:c08.asm ;文件说明:用户程序 ;创建日期:2011-5-5 18:17 ; ...

  10. ErlangC 最佳人力效益指标

    以平均服务时间(AHT)180秒,顾客来电量每15分钟150通以及服务目标时间在20秒内为例子说明最佳人力效益指标.此假设条件下由Erlang C模拟器的结果如下图, 假设我希望客服中心的期望服务水准 ...