调用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 "