android开发:NDK开发配置

Android Stuido的NDK环境搭建
第一步:下载NDK
有两种方式:
第一种:直接通过android studio工具下载
第二种:通过浏览器,官网下载:
https://developer.android.google.cn/ndk/downloads/

注意:下载ndk版本,如果是 android-ndk-r22-windows-x86_64.zip,安装成功,但是后面会遇到问题,
Android选择NDK出现“NDK does not contain any platforms”
这问题可以重新下载低版本的NDK
比如:android-ndk-r20b-windows-x86_64.zip

第一种方式:直接通过android studio工具下载,这个自己的电脑需要能够可以访问外网。

打开SDK Manager,找到Android SDK->SDK Tool选项,安装CMake、LLDB、NDK插件。
android开发:NDK开发配置_第1张图片

第二步:安装NDK
打开android studio
File–>Settings–>Project structure–>SDK Location
android开发:NDK开发配置_第2张图片
配置快捷键
在android studio上设置javah和ndk-build的快捷键

在studio中setting中可以添加一些extend tool方便开发
setting中选择extend tool

android开发:NDK开发配置_第3张图片
设置javah
android开发:NDK开发配置_第4张图片
设置 ndk-build
android开发:NDK开发配置_第5张图片
设置 ndk-build-clean
android开发:NDK开发配置_第6张图片

JNI开发流程的步骤:

  1. 在Java中先声明一个native方法
  2. 通过快捷键 javah 导出JNI的.h头文件
  3. 根据头文件,实现接口编写cpp文件
  4. 编写mk文件
  5. 通过快捷键ndk-build,生成so库文件

在Java中先声明一个native方法
在android studio新建一个项目
举例子:
android开发:NDK开发配置_第7张图片

package com.adayo.service.ndkdemo3;

public class CarMonitorJNI {
    static {
        System.loadLibrary("CarMonitorJni");
    }
    public  static native void setDeviceValue(String key,int value);
    public  static native int getDeviceValue(String key);
}

通过快捷键 javah 导出JNI的.h头文件
android开发:NDK开发配置_第8张图片
com_adayo_service_carmonitorservice_CarMonitorJNI.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_adayo_service_carmonitorservice_CarMonitorJNI */

#ifndef _Included_com_adayo_service_carmonitorservice_CarMonitorJNI
#define _Included_com_adayo_service_carmonitorservice_CarMonitorJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_adayo_service_carmonitorservice_CarMonitorJNI
 * Method:    setDeviceValue
 * Signature: (Ljava/lang/String;I)V
 */
JNIEXPORT void JNICALL Java_com_adayo_service_carmonitorservice_CarMonitorJNI_setDeviceValue
  (JNIEnv *, jclass, jstring, jint);

/*
 * Class:     com_adayo_service_carmonitorservice_CarMonitorJNI
 * Method:    getDeviceValue
 * Signature: (Ljava/lang/String;)I
 */
JNIEXPORT jint JNICALL Java_com_adayo_service_carmonitorservice_CarMonitorJNI_getDeviceValue
  (JNIEnv *, jclass, jstring);

#ifdef __cplusplus
}
#endif
#endif

在项目src/main 目录下,创建jni目录,include目录,src目录
准备第三方so库文件:libevsserviceclient.so
第三方so库的头文件:EvsServiceCltManager.h

把头文件放在jni/include目录下
把cpp文件放在jni/src目录下
android开发:NDK开发配置_第9张图片

根据头文件,实现接口编写cpp文件
com_adayo_service_carmonitorservice_CarMonitorJNI.cpp

//
// Created by Y4652 on 2021/2/19.
//

#include "include/com_adayo_service_carmonitorservice_CarMonitorJNI.h"
#include <string.h>
#include <stdio.h>
#include "include/EvsServiceCltManager.h"
#include <jni.h>
#include  <android/log.h>
using namespace std;

using ::android::EvsServiceCltManager;
#define TAG    "carmonitorservice" // 这个是自定义的LOG的标识
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,TAG,__VA_ARGS__)
#define LOGD(...)  __android_log_print(ANDROID_LOG_DEBUG,TAG,__VA_ARGS__) // 定义LOGD类型

JNIEXPORT jint JNICALL Java_com_adayo_service_carmonitorservice_CarMonitorJNI_getDeviceValue
                            (JNIEnv *env, jclass obj , jstring str) {
    LOGI("####CarMonitorService###### i = %d", 222222);
   
    EvsServiceCltManager::getInstance()->connectEvsService();

    // 暂时写死测试用
    return 123456;
}

/*
 * Class:     Java_com_adayo_proxy_adas_evs_EvsCameraMng
 * Method:    setDeviceValue
 */
JNIEXPORT void JNICALL Java_com_adayo_service_carmonitorservice_CarMonitorJNI_setDeviceValue(JNIEnv *env, jclass jazz , jstring type,jint value){

   LOGI("####CarMonitorService###### i = %d", 3333);
    EvsServiceCltManager::getInstance()->connectEvsService();

}

编写mk文件
Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := evsserviceclient
LOCAL_SRC_FILES := libevsserviceclient.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_C_INCLUDES := \
    $(LOCAL_PATH)/include/


LOCAL_MODULE := libCarMonitorJni
LOCAL_LDLIBS :=-llog
LOCAL_SHARED_LIBRARIES :=evsserviceclient

include $(BUILD_SHARED_LIBRARY)

Application.mk

APP_ABI :=arm64-v8a

通过快捷键ndk-build,生成so库文件
android开发:NDK开发配置_第10张图片
android开发:NDK开发配置_第11张图片
android开发:NDK开发配置_第12张图片

配置环境过程中遇到的一下问题:
问题一:
android开发:NDK开发配置_第13张图片
在Android Studio中配置NDK时,可能出现NDK does not contain any platforms的错误,这是因为NDK版本过高,不适配当前版本的Android Studio。
解决方法:下载低版本比如:21.06
https://blog.csdn.net/u012308094/article/details/113982299

问题二:

Error: Your project contains C++ files but it is not using a supported native build system.

解决:
参考地址

参考资源:
Android Studio3.0之NDK环境搭建

Android Studio NDK 入门教程(2)–Java与C++之间的简单数据转换与传递

javah 生成头文件时报找不到类路径的解决办法

Android Studio 简单生成so文件并调用

Android Studio 使用ndk-build构建Jni

你可能感兴趣的:(android,NDK)