Как импортировать библиотеку Python в C++, используя собственный интерфейс Java - Android Studio

Я пытаюсь импортировать библиотеку Python в существующий проект, который использует JNI. То, чего мы пытаемся достичь, это вызвать скрипт на python из исходного кода JNI, написанного на C++.

Поэтому мы постарались включить библиотеку 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)

1 ответ

Решение

После нескольких часов исследований мы, наконец, сделали это, надеюсь, это поможет кому-то быстрее справиться: мы перешли с 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.

Другие вопросы по тегам