五.NDK调用so库

NDK调用so库,和原生.h和.cpp的方式大同小异,调用so库实际是将so库当成cpp使用

一.添加要被调用的so库

在这里插入图片描述

二.CMakeLists.txt添加链接

# 指定cmke版本
cmake_minimum_required(VERSION 3.4.1)
include_directories(src/main/cpp/include) #添加头文件的位置
#编译CPP到call-lib
add_library(call-lib
        SHARED
        src/main/cpp/Hello.cpp) #添加.c源文件,这里的Hello.cpp后面会有解释

#命名一个native-lib的库对象,并添加到library,这个库对象是我们前面添加进去
add_library(native-lib
        SHARED
        IMPORTED)
#设置native-lib的实际so库路径
set_target_properties(native-lib PROPERTIES IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libnative-lib.so)
#将所有的lib都融合到call-lib中
target_link_libraries(
        call-lib
        native-lib
        -ljnigraphics #JNI层,添加bitmap支持
        ) #选择

三.引入头文件与调用

在这里插入图片描述
BitmapUtil.h是so库的头文件,Hello.h和Hello.cpp是Java调用C语言的NDK方法映射.
先看看BitmapUtil.h的内容:

#ifndef PRACTICLE_BITMAPUTIL_H
#define PRACTICLE_BITMAPUTIL_H
#include "Hello.h"
#include <jni.h>
#include <android/bitmap.h>
class BitmapUtil {
public:
    int gray(JNIEnv *env, jobject bitmap);
};

#endif //PRACTICLE_BITMAPUTIL_H

接下来看看Hello.h

#ifndef PRACTICLE_HELLO_H
#define PRACTICLE_HELLO_H

#include <jni.h>
#include <android/bitmap.h>

extern "C"
JNIEXPORT jint JNICALL
Java_com_example_a5_1opencv_MainActivity_gray(JNIEnv *env, jobject instance, jobject bitmap);
#endif //PRACTICLE_HELLO_H

Hello.cpp的内容:

#include <jni.h>
#include <BitmapUtil.h>
#ifdef __cplusplus
extern "C" {
#endif

JNIEXPORT jint JNICALL
Java_com_example_a5_1opencv_MainActivity_gray(JNIEnv *env, jobject instance, jobject bitmap) {
//   BitmapUtil的实现在so库里面
    BitmapUtil *bitmapUtil = new BitmapUtil;
    bitmapUtil->gray(env, bitmap);
    delete bitmapUtil;
    return JNI_TRUE;
} ;

#ifdef __cplusplus
}
#endif

所有的都实现好了,接下来就看看MainActivity吧

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ImageView srcIv = findViewById(R.id.iv_src);
        ImageView dstIv = findViewById(R.id.iv_det);
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.google);
        if (gray(bitmap) == 1) {
            dstIv.setImageBitmap(bitmap);
        }
    }
    static {
        System.loadLibrary("call-lib");
    }
    public native int gray(Bitmap bitmap);
}

四.运行结果

在这里插入图片描述

code:https://github.com/HumorSmith/NDKPraticle/tree/master/5_call_so

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页