在 Android 个 Studios C 文件中调用共享库 (.so) 方法

Call shared library (.so) methods within Android Studios C files

我已经为此苦苦挣扎了好几天。目前,我只是用一个简单的 C++ 项目(1 个 .h 和 1 个 .cpp 文件)和一个包含 ndk helloJNI 示例代码(非常容易运行)的简约应用程序对其进行测试:

目标 将现有 C/C++ 文件(项目)导入 Android Studio

方法 在尝试了一些(数十种)不同的可能性之后,我 think/thought 以下步骤将是满足我的目的的最佳解决方案:

  1. 从 Visual Studios 2015 创建共享库 (Calculator.so) "Create shared library for Android"(或其他)[成功]
  2. 在 src/main/ 中创建 jniLibs 文件夹及其子文件夹(x86 是我的相关文件夹)
  3. 在 src/main/jniLibs 中添加 Android.mk 文件,该文件必须放在那里 (?)
  4. 包含语句:System.loadLibrary("Calculator") MainActivity
  5. 中没有 "lib" 和“.so”

该库与 Android.mk 一样列在 Android Studio 的文件夹 jniLibs 中。此外,如果我构建 apk,则库已成功打包(通过解压缩验证)并且我没有收到任何错误。 但是: 我如何调用库中的方法?我尝试了其他线程中提供的不同解决方案,但我想我在 .mk 或上述步骤中遗漏了一些东西。

尝试过

非常感谢您的帮助!

Android.mk

LOCAL_PATH := $(call my-dir)
APP_ABI := x86        

# library info       
include $(CLEAR_VARS)
LOCAL_MODULE := Calculator
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/Calculator.so
LOCAL_EXPORT_C_INCLUDES := ..../Visual Studio 2015/Projects/SO_Library/SO_Library
include $(BUILD_SHARED_LIBRARY)

在Android NDK 中可以做很多事情。例如,相机硬件是 Android OS 中最重的硬件之一。检测人脸、事物、提供效果和数以千计的特征,NDK 是最好的。 对您的步骤有一些帮助:

  1. 您还可以在 Android Studio 中构建和预构建共享 (.so) 和静态 (.a) 库。不需要 Visual Studio。
  2. 不要在主文件夹中创建 jniLibs 文件夹。当您通过 gradle 构建项目时,它已经创建了这个文件夹并放置了您的目标库。如果你想预建任何库,将这些库放在 main/jni/libs 文件夹中,然后用 Android.mk 预建。
  3. 不要在 jnilibs 文件夹中添加 Android.mk 文件。在 main/jni 文件夹中创建此文件。还有 Application.mk 文件。
  4. 在任何 activity 需要的地方以静态方法调用您的库。像这样:

    static {  System.loadLibrary("my_library") }
    

    没有 "lib" 和“.so”扩展名。

当您想调用本地方法时,只需使用 "native" 关键字即可。例如:

private native int nGetNumberFromNativeSide();

只需在需要的地方调用此方法,即可获得结果。但是对于 gradle 端的 ndk 构建,请看这个 answer。要在 Android.mk 中构建库,这些示例行可能对您有所帮助:

include $(CLEAR_VARS)
ifneq (,$(filter $(TARGET_ARCH_ABI), armeabi-v7a x86 arm64-v8a x86_64))

LOCAL_MODULE := my_library
LOCAL_SRC_FILES := $(LOCAL_SRC_LOCATION)/native1.cpp native2.cpp
include $(BUILD_SHARED_LIBRARY)
  • 您可以随意命名,但不要添加 lib 和 .so 扩展名。 Ndk 已经在做了。
  • 我已经给出了Android.mk例子。
  • 当您构建 Android.mk 文件时,它会找到您的库的适当文件夹。喜欢main/libs/x86/libmy_library.so.

我想这个答案会对你有所帮助。如果您有更多问题,请添加评论,我将编辑我的答案并添加答案。