java - 如何使用 Java Native Interface 在 C++ 中导入 python 库 - Android Studio
问题描述
我正在尝试将 python 库导入到使用 JNI 的现有项目中。我们试图实现的是从用 C++ 编写的 JNI 源代码调用 python 脚本。
因此,我们确实尝试包含 python 库 (Python.h),如果没有正确的设置,就无法找到它。
Android.mk 已经存在,我知道我们可以将它包含在其中,但是再次需要 python 库的共享对象,对吗?
如果我们有一个共享对象,这就是我将写入 makefile Android.mk 的内容:
LOCAL_PATH := $(call my-dir)
# Include libpython2.7.so
include $(CLEAR_VARS)
LOCAL_MODULE := python2.7
LOCAL_SRC_FILES := ../python-for-android/dist/default/libs/armeabi/libpython2.7.so
include $(PREBUILT_SHARED_LIBRARY)
解决方案
经过数小时的研究,我们终于做到了,希望这能帮助人们更快地相处:我们从默认的 Android NDK 切换到CrystaX NDK 10,它已经为每个需要的架构编译了 libpython2.7.so。然后我们将我们的 Android.mk 调整为如下所示:
LOCAL_PATH := $(call my-dir)
CRYSTAX_PATH := /home/user/crystax-ndk-10.3.2
...
# Build libpyjni.so (pyjni.c may be an project source file you wrote)
include $(CLEAR_VARS)
LOCAL_MODULE := pyjni
LOCAL_SRC_FILES := pyjni.c
LOCAL_SHARED_LIBRARIES += python2.7 crystax
LOCAL_LDLIBS += -llog
include $(BUILD_SHARED_LIBRARY)
# Include libpython2.7.so
include $(CLEAR_VARS)
LOCAL_MODULE := python2.7
LOCAL_SRC_FILES := $(CRYSTAX_PATH)/sources/python/2.7/libs/$(TARGET_ARCH_ABI)/libpython2.7.so
LOCAL_SHARED_LIBRARIES := crystax
LOCAL_EXPORT_CFLAGS := -I $(CRYSTAX_PATH)/sources/python/2.7/include/python/
include $(PREBUILT_SHARED_LIBRARY)
# Include libcrystax.so (needed by python library)
include $(CLEAR_VARS)
LOCAL_MODULE := crystax
LOCAL_SRC_FILES := $(NDK_PATH)/sources/crystax/libs/$(TARGET_ARCH_ABI)/libcrystax.so
LOCAL_EXPORT_CFLAGS := -I $(NDK_PATH)/sources/crystax/include/
include $(PREBUILT_SHARED_LIBRARY)
之后我们可以在 Android Studio 中构建项目。
推荐阅读
- c - 使用 memcpy() 将缓冲区尾部移动到其开头?(重叠)
- c++ - 在从另一个对象的条件下创建一个对象
- scapy - Scapy 嗅探我刚刚发送的同一个数据包
- mysql - mysql 根据表 2 中第 1 列或第 2 列中的值从表 1 返回行
- c++ - 为什么 p1007r0 std::assume_aligned 不需要结语?
- sql-server - SQL Server 2008 - WHILE 循环
- android - 如何在android的listview中显示存储在db浏览器中的blob图像
- svg - PWA InkCanvas 在 javascript 中将笔画保存为 svg
- botframework - QnAMaker 迁移后无法到达端点
- javascript - JScroll:在 ajax 更改选项卡和 URI 后更改 nextHref