NDK

(Native Development Kit )

概述

NDK是一个集成了Android交叉编译环境的工具集,并提供了一套比较方便的Makefile,可以帮助开发者快速开发C或者C++的动态库,并自动的将so和java程序打包成apk,在Android上运行。

原生开发工具包 (NDK) 是一套工具,允许您为 Android 使用 C 和 C++ 代码,并提供众多平台库,您可用其管理原生 Activity 和访问物理设备组件,例如传感器和触摸输入。NDK 可能不适合大多数 Android 编程初学者,这些初学者只需使用 Java 代码和框架 API 来开发应用。然而,如果您需要完成一或多个以下事项,那么 NDK 就能派上用场:

  • 进一步提升设备性能,以实现低延迟时间,或运行计算密集型应用,如游戏或物理模拟。
  • 重复使用您自己或其他开发者的 C 或 C++ 库。

优势 

  • C/C++的效率比较高
  • C/C++对涉及硬件操作的支持好

配置NDK开发环境

要为您的应用编译和调试原生代码,您需要以下组件:

  • Android 原生开发工具包 (NDK):这套工具允许您为 Android 使用 C 和 C++ 代码。
  • CMake:一款外部构建工具,可与 Gradle 搭配使用来构建原生库。如果您只计划使用 ndk-build,则不需要此组件。
  • LLDB:一种调试程序,Android Studio 使用它来调试原生代码。

下载

在较新版本的Android Studio中可以通过 Tools > Android > SDK Manager 方便的下载LLDBCMake 和 NDK

也可以通过面的网站下载

https://developer.android.google.cn/ndk/downloads/index.html

目前:最新稳定版本 (r19c)、最新测试版 (r20 Beta 1)

官方也提供了demo的下载

https://github.com/googlesamples/android-ndk

下载完毕后点击

如果是通过Android Studio下载的,点击Select defaul NDK即可自动填充路径

然后是环境变量

首先建一个...其实不建直接加path也可以,变量值为NDK的路径

JNI

JNI是Java Native Interface的缩写,译为JAVA本地调用。

Java Native Interface(JNI)标准从Java1.1开始成为java平台一部分,它允许java代码和其他语言写的代码进行交互。

JNI is the Java Native Interface. It defines a way for the bytecode that Android compiles from managed code (written in the Java or Kotlin programming languages) to interact with native code (written in C/C++). JNI is vendor-neutral, has support for loading code from dynamic shared libraries, and while cumbersome at times is reasonably efficient.

更多可以参考https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html

JNI程序实现步骤

  1. 编写带有native声明方法java类
  2. 使用javac命令编译所编写的java类
  3. 然后利用javah+java类名生成扩展名为h的头文件
  4. 使用C/C++实现本地方法
  5. 将C/C++编写的文件生成动态链接库
  6. 加载动态链接库文件,调用native方法,测试

 

 

 


案例

布局

<?xml version="1.0" encoding="utf-8"?>            

初步主体代码

package com.example.ndk;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.EditText;import android.widget.TextView;public class MainActivity extends AppCompatActivity {    private EditText number1, number2;    private TextView sum_text;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        number1 = findViewById(R.id.number1);        number2 = findViewById(R.id.number2);        sum_text = findViewById(R.id.sum_text);    }    //声明一个本地方法,该方法由C、C++实现    public native int add(int num1, int num2);    //按钮点击事件    public void sum_button(View view) {        String num1 = number1.getText().toString();        String num2 = number2.getText().toString();        //调用本地方法        int result = add(Integer.parseInt(num1), Integer.parseInt(num2));    }}

JAVAH命令

java环境默认已经配好

打开终端,先通过一系列cd命令到项目的java路径下

粗体这段是你的包名

输入javah -jni com.example.ndk.MainActivity

md...很尴尬了

下面是探索解决过程的办法

https://blog.csdn.net/nishigesb123/article/details/90024821

但是最终还是没能解决,多方求助也还是未果

考虑到我的JDK版本和SDK比较新,怀疑是版本更新改了什么东西

试着去添加v4 v7包到classpath发现无论哪个版本的v4 v7包总会提示少个什么类

 

这篇文章永久性施工中——开工时间待定

 

部分参考:

https://developer.android.google.cn/training/articles/perf-jni

https://developer.android.google.cn/ndk/guides/ 

更多相关文章

  1. Android系列之GreenDao数据升级和加密(三)
  2. 【Android】显示网络图片代码分析
  3. Android(安卓)4.2 Bluetooth 分析总结(一)
  4. Google Android(安卓)SDK舍弃Java ME,支持Java Lite和Apache Harm
  5. Android(安卓)ListView使用BaseAdapter与ListView的优化
  6. Android的视频通话的Java代码
  7. Android开发系列之调用WebService
  8. Android:快速修改ramdisk.img脚本
  9. Ubuntu下安装VirtualBox和Android(安卓)安装到虚拟机中

随机推荐

  1. Android(安卓)Handler
  2. Android实现图表绘制和展示
  3. 10个快速开发Android/Iphone web App应用
  4. Android(安卓)webview
  5. Android系统上部署usb打印机
  6. android HAL 详解
  7. ANDROID音频系统散记之二:resample-1
  8. Android中MVP模式
  9. Android(安卓)学习笔记(4)—— ToggleButto
  10. AndroidX介绍及项目迁移