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开发流程的步骤:
在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
配置环境过程中遇到的一下问题:
问题一:
在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