Android studio3 0环境下进行NDK开发的环境配置与流程

首先给大家推荐一下我老师大神的人工智能教学网站。教学不仅零基础,通俗易懂,而且非常风趣幽默,还时不时有内涵黄段子!点这里可以跳转到网站

如果Android studio之前没有进行过NDK相关的配置的话,那么首先就要在Android studio的File->Project Structure窗口下进行NDK的相关下载;如下图没有下载之前

点击Download下载,下载好之后as会自动将ndk加载到项目中,默认情况下ndk下载到了sdk所在的目录下,如下图所示:

下载完成时候也可以通过local.properties文件查看sdk和ndk在电脑上的保存路径,local.properties文件的内容如下:

## This file is automatically generated by Android Studio.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
#
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
#Wed Jan 24 15:14:42 CST 2018
ndk.dir=D\:\\develop\\android_studio_sdk\\ndk-bundle
sdk.dir=D\:\\develop\\android_studio_sdk

第二步:在Java包下新建书写本地方法的Java类,本案例以Hello.java为例,并书写要使用的本地方法callFromC()如下所示:

package com.example.sun.sdkdemo;

/**
 * Created by su on 2018/1/24.
 */

public class Hello {
    public static native String callFromC();
}

这个时候方法会报错提示说找不到头文件,先不着急处理,让我们接着进行下一步操作,生成本地方法所对应的头文件,在生成头文件之前编译一下我们的module,进行Build->make Module ‘app’操作

第三步:cmd进入命令行窗口,在命令行窗口下进入到该工程的main目录下;首先右键单击app,选择show in Explorer打开该工程app所在的盘符路径,接着点击app进入src,再点击src进入到main所在的文件列表,点击main打开main的目录,在上面的路径处复制路径,在dos窗口下输入:cd  /d  上述复制的路径,单击回车就进入到的main路径下,接着输入:javah -d jni classpath ..\..\build\intermediates\classes\debug 本地方法类所在的包名.本地方法的类名,然后按回车键就生成了相关的头文件。如下所示

中间报的那两次错误是因为书写本地方法后没有Build,所以在生成头文件之前应该Build一下。

另第三步:在Android studio的termianl窗口下,输入cd app/src/main/java/,然后按回车,再次输入:javah -d ../jni 包名.类名,按回车,这样也可以生成头文件,前提是将你电脑上sdk的platform-tools的路径配置到环境变量中。

第四步:在jni目录下创建hello.c文件,实现头文件中的方法;并创建Android.mk文件,内容如下:

#include "com_example_sun_sdkdemo_Hello.h"

JNIEXPORT jstring JNICALL Java_com_example_sun_sdkdemo_Hello_callFromC
  (JNIEnv * env, jclass jclas){
         return (*env)->NewStringUTF(env,"from c");
  }
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := hello
LOCAL_SRC_FILES := hello.c

# for logging
LOCAL_LDLIBS    += -llog

include $(BUILD_SHARED_LIBRARY)

Android.mk文件中的LOCAL_MODULE :=hello指定的是生成动态库的名字,LOCAL_SRC_FILES :=hello.c关联的是jni目录下的.c文件。

第五步:编译配置,在module/build.gradle中添加如下内容

点击配置文件上面出现的sync

第六步:在Hello.java中加载动态库如下:

package com.example.sun.sdkdemo;

/**
 * Created by su on 2018/1/24.
 */

public class Hello {
    static {
        System.loadLibrary("hello");
    }
    public static native String callFromC();
}

第七步:在MainActivity中的Button点击事件中调用本地方法

package com.example.sun.sdkdemo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {
    private Button mButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mButton = (Button) findViewById(R.id.btu_call_from_c);
        mButton.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                mButton.setText(Hello.callFromC());
            }
        });
    }
}

这样就完成了一般的NDK使用流程

点这里可以跳转到人工智能网站