NDK - 包含一个预构建的库,并在 Android 项目中调用本机函数
NDK - Include a Prebuilt library and call a native function in Android Project
>假设我们有一个名为libname.a的预构建原生库。 我们需要从 Java 活动调用原生库中包含的本机函数。一个例子是存储在主头文件中的这个:
DLLEXPORT int DLLCALL function(Xhandle handle, unsigned char *srcBuf, unsigned char *dstBuf);
其中Xhandle
是头文件中也定义的结构。
我们拥有的文件结构如下:
armv6
|- header1.h
|- header2.h
|- ...
|- libname.a
armv7
|- header1.h
|- header2.h
|- ...
|- libname.a
x86
|- header1.h
|- header2.h
|- ...
|- libname.a
我们需要将此库导入我们的 Android 项目。 我们做了什么:
- 已安装 NDK 和 CMake 工具。
- 选中包括创建项目时C++支持。
- 在项目中创建了一个 jni 目录,并复制了上面提到的文件。
我们的CMakeList.txt
文件(存储在项目根文件夹中):
cmake_minimum_required(VERSION 3.4.1)
add_library( name
STATIC # We guessed it's a static due to the .a extension
IMPORTED # No source code (.c or .cpp) available )
然后我们在 jni 目录中创建了一个Android.mk
文件:
LOCAL_PATH := $(call my-dir)
TARGET_ARCH_ABI := armv7
include $(CLEAR_VARS)
LOCAL_MODULE := name
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libname.a
LOCAL_EXPORT_C_INCLUDES := $(TARGET_ARCH_ABI)
include $(PREBUILT_STATIC_LIBRARY)
所有这些都是通过阅读以下链接推断出来的:
- Android.mk
- 预构建
- 添加本机代码
现在在我们的 java 活动中,我们知道我们需要添加这样的东西:
public native int function();
// Used to load the 'native-lib' library on application startup.
static {
System.loadLibrary("name");
}
我们觉得我们做错了什么,我们错过了一些东西。我们还必须定义参数,我们认为我们应该编写一个包装器。
因此,任何帮助将不胜感激。
Java 类中的函数原生方法需要
JNIEXPORT jstring JNICALL Java_my_package_name_MyClass_function(JNIEnv *env, jobject instance)
在C++方面。您的libname不提供此类导出功能,因此您必须自己准备它,正如 Richard Critten 在评论中解释的那样。您可以将包装器函数放在文件jniWrapper.cpp中,放在Android.mk旁边。
您的Android.mk可能看起来像
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := name
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libname.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/$(TARGET_ARCH_ABI)
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := jniWrapper
LOCAL_SRC_FILES := jniWrapper.cpp
LOCAL_STATIC_LIBRARIES := name
include $(BUILD_SHARD_LIBRARY)
最后,lodalLibrary()无法加载静态库;Java 类的静态构造函数可能如下所示
static {
System.loadLibrary("jniWrapper");
}
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 无法将标准库导入本机 android 项目中的头文件
- 将 CPP 类添加到 Android 项目中
- CMake:Android Studio 原生活动项目无法在项目根目录之外找到第三方库
- C++17 标准库包括不适用于 Visual Studio 2017 中的 Android 项目
- 如何在Android Studio中将C++文件正确链接到现有的Android项目?
- 部署基于 qt 的项目后,我的 sqlite3 文件不会被复制 (android)
- Android Studio-在现有的旧项目中启用本机C++调试(card.io Android Source)
- 如何使用CMAKE将FFTW添加到Android项目中
- 暂时将C++项目(VS2015)移至Android操作系统.编译器选项?
- 为什么当我的项目是使用 Android NDK r16 构建时,我会收到来自 Android NDK r11 的错误消息
- 将项目导入 Android Studio 后出错
- 在Android Studio项目中使用tensorflow lite C++API的问题
- Android Studio 项目中的 c++ 代码是否最终出现在 apk 文件中(除了 .so 文件)
- 如何将 Android 项目与 libandroid 与 Cmake 联系起来
- Android Gradle避免了CMake项目不必要的重建
- 如何使用 Cmake 将 FreeType 库添加到我的 Android Studio 原生项目中
- NDK - 包含一个预构建的库,并在 Android 项目中调用本机函数
- 将 cpp 文件添加到 cocos2d-x 项目 android 项目
- 如何在多项目Android构建中排除重复的C共享库(.so)