android开发:NDK开发配置

本文详细介绍了如何在Android Studio中搭建NDK环境,包括通过Android Studio工具和官网下载NDK,以及解决高版本NDK可能导致的问题。接着,文章展示了JNI开发的完整步骤,从声明native方法到生成SO库文件,并提供了头文件、cpp文件和mk文件的示例。此外,还提及了在配置过程中可能遇到的两个问题及其解决方案。
摘要由CSDN通过智能技术生成

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插件。
在这里插入图片描述

第二步:安装NDK
打开android studio
File–>Settings–>Project structure–>SDK Location
在这里插入图片描述
配置快捷键
在android studio上设置javah和ndk-build的快捷键

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

在这里插入图片描述
设置javah
在这里插入图片描述
设置 ndk-build
在这里插入图片描述
设置 ndk-build-clean
在这里插入图片描述

JNI开发流程的步骤:

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

在Java中先声明一个native方法
在android studio新建一个项目
举例子:
在这里插入图片描述

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头文件
在这里插入图片描述
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目录下
在这里插入图片描述

根据头文件,实现接口编写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库文件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

配置环境过程中遇到的一下问题:
问题一:
NDK does not contain any platforms问题解决
在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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值