android Ndk学习笔记01之Hello World!

官方参考链接

1.为什么使用NDK

1.代码保护:由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。
2.效率高:大部分现存的开源库都是用C/C++代码编写的。
3.便于移植:用C/C++写得库可以方便在其他的嵌入式平台上再次使用。

2.配置环境

工具:android studio
使用android studio开发JIN特别简单,只要把红色区域勾选上就可以了。

android Ndk学习笔记01之Hello World!_第1张图片
配置NDK环境

2.创建NDK项目

第一步

点击File-->New-->New Project,出现下图;

android Ndk学习笔记01之Hello World!_第2张图片
创建包含C++的项目

⚠️一定要勾选Include C++ support

第二步

点击next,选择版本,
继续next,添加Activity类型,
继续next,创建Activity以及布局文件,
最后,到如下页面:

android Ndk学习笔记01之Hello World!_第3张图片
C++设置页面

C++ Standard:使用下拉列表选择您希望使用哪种 C++ 标准。选择 Toolchain Default 会使用默认的 CMake 设置。
Exceptions Support:如果您希望启用对 C++ 异常处理的支持,请选中此复选框。如果启用此复选框,Android Studio 会将 -fexceptions 标志添加到模块级 build.gradle 文件的 cppFlags 中,Gradle 会将其传递到 CMake。
Runtime Type Information Support:如果您希望支持 RTTI,请选中此复选框。如果启用此复选框,Android Studio 会将 -frtti 标志添加到模块级 build.gradle 文件的 cppFlags 中,Gradle 会将其传递到 CMake。

⚠️课根据自己的需求,进行自定义配置。

点击Finish,项目创建完成。、

第四步

等待项目编译完成之后,直接运行Run ’app‘,你就看见Hello World啦,如图;


android Ndk学习笔记01之Hello World!_第4张图片
Hello from C++

2.代码分析

是不是很疑惑,一句代码都没有写,就完成了第一个NDK项目?那是我们的AS越来越强大了,只要添加了Include C++ support,AS会自动帮我们实现Hello World,是不是很给力呢。
现在,我们分析分析,用代码是怎么实现的吧。

  • HelloActivity
package com.android.ndkstudy.ui;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

import com.android.ndkstudy.R;
public class HelloActivity extends AppCompatActivity {

    // Used to load the 'native-lib' library on application startup.
    // 1.导入NDK jar包,即平时使用的so文件
    // 使用静态方法,保证在使用时前,架包已导入。
    static {
        System.loadLibrary("native-lib");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_hello);

        // Example of a call to a native method
        TextView tv = (TextView) findViewById(R.id.sample_text);
        tv.setText(stringFromJNI());//3 直接使用native方法
    }

    /**
     * A native method that is implemented by the 'native-lib' native library,
     * which is packaged with this application.
     * 2 直接使用so库中的方法,使用 native 关键字,即so的方法
     */
    public native String stringFromJNI();、
}

  • native-lib.cpp
#include 
#include 

extern "C"
JNIEXPORT jstring

JNICALL
Java_com_android_ndkstudy_ui_HelloActivity_stringFromJNI(//方法名,即包的路径,加上_方法名
        JNIEnv *env,
        jobject /* this */) {
    std::string hello = "Hello from C++";//对字符串赋值
    return env->NewStringUTF(hello.c_str());//返回数据
}

参数简介:

  • JNIEnv :局部数据的指针,用于传递数据;
  • jobject:类引用,即当前对象
    备注:⚠️NDK开发中,包的路径是绝对路径,不应该随便更改,若更改java中的包路径,NDK中的路径也要随之更改。

你可能感兴趣的:(android Ndk学习笔记01之Hello World!)