调用so文件有两种方式,一种是标准的jni文件,另外一种不是jni标准。jni标准可以直接用jni标准来调用,非jni标准的需要外面包裹一层jni标准才能调用。下面就演示怎么用。

NKD可以用ndk-build来编译,也可以用cmake来编译。这里用的是cmake。
CMakeList.txt内容。

# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html

# Sets the minimum version of CMake required to build the native library.

cmake_minimum_required(VERSION 3.4.1)

# 这里设置外部代码根目录
set(distribution_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../../../distribution)

#调用第三方so文件
add_library(slzr-lib SHARED IMPORTED)
set_target_properties(slzr-lib PROPERTIES IMPORTED_LOCATION
        ${distribution_DIR}/slzr/lib/${ANDROID_ABI}/libslzr.so)

#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
#主so文件配置
add_library(native-lib
        SHARED
        #这里设置需要引入的c文件
#        ${distribution_DIR}/slzr/src/libposapplication.cpp
        native-lib.cpp)

#这里设置生成so文件的输出目录,可以不设置
set_target_properties(native-lib
        PROPERTIES
        LIBRARY_OUTPUT_DIRECTORY
        "${distribution_DIR}/native-lib/lib/${ANDROID_ABI}")

#这里设置外部源码位置
target_include_directories(native-lib PRIVATE
#        ${distribution_DIR}/slzr/src
        ${distribution_DIR}/slzr/include)

find_library(log-lib
        log)


target_link_libraries(native-lib
        slzr-lib   #第三方so文件

        ${log-lib})

CMakeList里面设置了第三方的so库地址。
值得注意的是set_target_properties设置需要放到对应的add_library的下面。target_link_libraries需要加入第三方so文件的名称。
我这里直接生成一个测试的非标准的jni文件给项目来调用。

这里是封装的c++调用。

#include <jni.h>
#include <string>
#include <stdio.h>
#include <iostream>
#include "stdint.h"
#include <libposapplication_global.h>

#include <libposapplication.h>
#include<android/log.h>
#define LOG_TAG "System.out.c"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
/**
 * 封装c/c++与java的接口
 */


int soso(char *data) {
    printf("*********test*********");
    std::cout << "Hello World!" << std::endl;
    LOGI("这是来自tsoso");
    return 1;
}




extern "C" JNIEXPORT jstring JNICALL
Java_com_example_ndktest2_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = "Hello from C++";

    LOGD("调用了testapp");
    testapp();
    LOGI("这是来自so里面的info信息");

    IC_test cal;
    cal.call_test = soso;
    int i = call_back(&cal);
    LOGI("这是来自so里面的info123");

    return env->NewStringUTF(hello.c_str());
}

代码比简单,testapp();是so文件里面的函数。call_back是so文件里面回调函数。这里设置int soso(char *data)为回调函数加进去。
下面看下非JNI标准的c代码。

#include "libposapplication.h"
#include<stdio.h>
#include<iostream>
#include"stdint.h"

LibPosApplication::LibPosApplication()
{
 printf("测试lib");
}
LIBPOSAPPLICATIONSHARED_EXPORT void testapp()
{
     printf("*********test*********");
     std::cout<<"Hello World!"<<std::endl;
    LOGI("这是来自testapp");
}

extern "C"{
LIBPOSAPPLICATIONSHARED_EXPORT int call_back(IC_test *body)
{
    int ret;
    printf("%s\n",__FUNCTION__);
       std::cout<<"Hello call_back!"<<std::endl;
    ret=(body->call_test)("你好啊");
    return 1;
}
}
//回调函数实现

附件:
demo源码地址

打赏 赞(0)
微信
支付宝
微信二维码图片

微信扫描二维码打赏

支付宝二维码图片

支付宝扫描二维码打赏

分类: Android

0 条评论

发表评论

电子邮件地址不会被公开。