安卓NDK——原生开发工具包

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

下载完毕后点击

安卓NDK——原生开发工具包_第1张图片

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

安卓NDK——原生开发工具包_第2张图片

然后是环境变量

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

安卓NDK——原生开发工具包_第3张图片

安卓NDK——原生开发工具包_第4张图片

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方法,测试

 

 

 


案例

布局




    

    

    

初步主体代码

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比较新,怀疑是版本更新改了什么东西

安卓NDK——原生开发工具包_第5张图片

安卓NDK——原生开发工具包_第6张图片

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

 

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

 

部分参考:

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

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

你可能感兴趣的:(安卓开发)