vs安装相应库
安装opencv-for-Android到任意盘中
属性表配置
首先选择相应平台 ARM ARM64 X86 X64
分别对应 armeabi-v7a armeabi-v8a x86 x86_64 相应文件库
注:这里输入依赖项目时,在相应路径1.输入“cmd" 2.再输入 dir /b *.so>1.txt 这段代码 含义为将后缀为.so的文件名导入到1.txt文档中 这样就不用一个一个修改了
VS2019动态库编译架构
OpenCVFunc.h
#pragma once
float TestOpencv(float* buf, int len);
float TestMath();
OpenCVFunc.cpp
#include "OpenCVFunc.h"
#include <math.h>
#include <opencv.hpp>
float TestOpencv(float* buf, int len)
{
cv::Mat mat = cv::Mat(len, 1, CV_32FC1, buf);
auto sum = cv::sum(mat);
return sum.val[0];
}
float TestMath()
{
return sqrt(2.0f);
}//这里运用了sqrt 需要在依赖添加 -lm
SharedObject9.h
#pragma once
class SharedObject9
{
public:
const char * getPlatformABI();
SharedObject9();
~SharedObject9();
};
SharedObject9.cpp
#include "SharedObject9.h"
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "SharedObject9", __VA_ARGS__))
#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "SharedObject9", __VA_ARGS__))
extern float TestOpencv(float* buf, int len);
extern float TestMath();
extern "C" {
float ExternTestOpencv(float* buf, int len) //这个用来导出给Android JNI使用
{
return TestOpencv(buf, len);
}
float ExternTestMath()//这个用来导出给Android JNI使用
{
return TestMath();
}
//C++导出给Java类使用的命名规范
//Java_packagename_classname_functionname
//第一个传参总是JNIEnv* env
//第二个传参 如果是static成员函数就是jclass type,
// 如果是非static成员函数就是jobject thiz,
//第三个传参才是真正的参数
JNIEXPORT jfloat JNICALL
Java_com_jniexample_JNIInterface_CVTestSum(JNIEnv* env, jclass type, jfloatArray buf) //这个用来导出给Java使用
{
auto len = env->GetArrayLength(buf);
jboolean notcopy = JNI_FALSE;
float* fptr = env->GetFloatArrayElements(buf, ¬copy);//从Java内存转换到native指针
return TestOpencv(fptr, len);
}
JNIEXPORT jfloat JNICALL
Java_com_jniexample_JNIInterface_TestSum(JNIEnv* env, jclass type, jfloatArray buf)//这个用来导出给Java使用
{
auto len = env->GetArrayLength(buf);
jboolean notcopy = JNI_FALSE;
float* fptr = env->GetFloatArrayElements(buf, ¬copy);
float sum = 0;
for (size_t i = 0; i < len; i++)
{
sum += fptr[i];
}
return sum;
}
JNIEXPORT jfloat JNICALL
Java_com_jniexample_JNIInterface_TestMath(JNIEnv* env, jclass type)//这个用来导出给Java使用
{
return TestMath();
}
//此简单函数返回平台 ABI,此动态本地库为此平台 ABI 进行编译。
const char* SharedObject9::getPlatformABI()
{
#if defined(__arm__)
#if defined(__ARM_ARCH_7A__)
#if defined(__ARM_NEON__)
#define ABI "armeabi-v7a/NEON"
#else
#define ABI "armeabi-v7a"
#endif
#else
#define ABI "armeabi"
#endif
#elif defined(__i386__)
#define ABI "x86"
#else
#define ABI "unknown"
#endif
LOGI("This dynamic shared library is compiled with ABI: %s", ABI);
return "This native library is compiled with ABI: %s" ABI ".";
}
void SharedObject9()
{
}
SharedObject9::SharedObject9()
{
}
SharedObject9::~SharedObject9()
{
}
}
pch.h
#include <jni.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <sys/resource.h>
#include <android/log.h>
库文件所在地
至此,关于vs2019编译动态库解决