在 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 以下步骤将是满足我的目的的最佳解决方案:
- 从 Visual Studios 2015 创建共享库 (Calculator.so) "Create shared library for Android"(或其他)[成功]
- 在 src/main/ 中创建 jniLibs 文件夹及其子文件夹(x86 是我的相关文件夹)
- 在 src/main/jniLibs 中添加 Android.mk 文件,该文件必须放在那里 (?)
- 包含语句:System.loadLibrary("Calculator") MainActivity
中没有 "lib" 和“.so”
该库与 Android.mk 一样列在 Android Studio 的文件夹 jniLibs 中。此外,如果我构建 apk,则库已成功打包(通过解压缩验证)并且我没有收到任何错误。
但是: 我如何调用库中的方法?我尝试了其他线程中提供的不同解决方案,但我想我在 .mk 或上述步骤中遗漏了一些东西。
尝试过
- native-lib.cpp 中的不同
#include <myLib>
语句,例如 s
- 不同的 Android.mk 设置(但我是制作文件的新手,所以即使是教程也无法帮助我解决我的具体问题 :))
- libCalculator.so 的其他位置,例如子文件夹 x86
- 和许多其他人 - 根本不提醒 atm (wasntme)
非常感谢您的帮助!
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 是最好的。
对您的步骤有一些帮助:
- 您还可以在 Android Studio 中构建和预构建共享 (.so) 和静态 (.a) 库。不需要 Visual Studio。
- 不要在主文件夹中创建 jniLibs 文件夹。当您通过 gradle 构建项目时,它已经创建了这个文件夹并放置了您的目标库。如果你想预建任何库,将这些库放在 main/jni/libs 文件夹中,然后用 Android.mk 预建。
- 不要在 jnilibs 文件夹中添加 Android.mk 文件。在 main/jni 文件夹中创建此文件。还有 Application.mk 文件。
在任何 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.
我想这个答案会对你有所帮助。如果您有更多问题,请添加评论,我将编辑我的答案并添加答案。
我已经为此苦苦挣扎了好几天。目前,我只是用一个简单的 C++ 项目(1 个 .h 和 1 个 .cpp 文件)和一个包含 ndk helloJNI 示例代码(非常容易运行)的简约应用程序对其进行测试:
目标 将现有 C/C++ 文件(项目)导入 Android Studio
方法 在尝试了一些(数十种)不同的可能性之后,我 think/thought 以下步骤将是满足我的目的的最佳解决方案:
- 从 Visual Studios 2015 创建共享库 (Calculator.so) "Create shared library for Android"(或其他)[成功]
- 在 src/main/ 中创建 jniLibs 文件夹及其子文件夹(x86 是我的相关文件夹)
- 在 src/main/jniLibs 中添加 Android.mk 文件,该文件必须放在那里 (?)
- 包含语句:System.loadLibrary("Calculator") MainActivity 中没有 "lib" 和“.so”
该库与 Android.mk 一样列在 Android Studio 的文件夹 jniLibs 中。此外,如果我构建 apk,则库已成功打包(通过解压缩验证)并且我没有收到任何错误。 但是: 我如何调用库中的方法?我尝试了其他线程中提供的不同解决方案,但我想我在 .mk 或上述步骤中遗漏了一些东西。
尝试过
- native-lib.cpp 中的不同
#include <myLib>
语句,例如 s - 不同的 Android.mk 设置(但我是制作文件的新手,所以即使是教程也无法帮助我解决我的具体问题 :))
- libCalculator.so 的其他位置,例如子文件夹 x86
- 和许多其他人 - 根本不提醒 atm (wasntme)
非常感谢您的帮助!
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 是最好的。 对您的步骤有一些帮助:
- 您还可以在 Android Studio 中构建和预构建共享 (.so) 和静态 (.a) 库。不需要 Visual Studio。
- 不要在主文件夹中创建 jniLibs 文件夹。当您通过 gradle 构建项目时,它已经创建了这个文件夹并放置了您的目标库。如果你想预建任何库,将这些库放在 main/jni/libs 文件夹中,然后用 Android.mk 预建。
- 不要在 jnilibs 文件夹中添加 Android.mk 文件。在 main/jni 文件夹中创建此文件。还有 Application.mk 文件。
在任何 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.
我想这个答案会对你有所帮助。如果您有更多问题,请添加评论,我将编辑我的答案并添加答案。