¡Mañana!Android NDK import-module/reuse de código
He creado un pequeño proyecto NDK que permite la serialización dinámica de objetos entre Java y C++ a través de JNI. La lógica funciona así:
frijol -> JavaCInterface.Java -> JavaCInterface.cpp -> JavaCInterface.java -> Frijol
El problema es que quiero utilizar esta funcionalidad en otros proyectos. Separé el código de prueba del proyecto y creé un proyecto "Tester". El proyecto del probador envía un objeto Java a C++ que luego lo envía de vuelta a la capa de Java.
pensé que une sería bastante simple - ("simple" en términos de NDK/JNI es por lo general un día de frustración) añadí el proyecto JNIBridge como un proyecto de código y que incluye las siguientes líneas a Android.mk:
NDK_MODULE_PATH=.../JNIBridge/jni/"
JNIBridge/JNI/JavaCInterface/Android.mk:
...
include $(BUILD_STATIC_LIBRARY)
JNITester/JNI/Android.mk:
...
include $(BUILD_SHARED_LIBRARY)
$(call import-module, JavaCInterface)
Todo esto funciona bien. Los archivos C++ que dependen de los encabezados del módulo JavaCInterface funcionan bien. Además, las clases de Java pueden usar interfaces del proyecto JNIBridge. Todos los enlaces están felices.
Desafortunadamente JavaCInterface.java que contiene las llamadas al método nativo no puede ver el método JNI ubicado en la biblioteca estática. (Lógicamente están en el mismo proyecto, pero ambos se importan al proyecto en el que desea utilizarlos a través del mecanismo anterior).
Mis soluciones actuales son las siguientes. Estoy esperando que alguien puede sugerir algo que va a preservar la naturaleza modular de lo que estoy tratando de lograr:
Mi solución actual sería incluir los archivos cpp JavaCInterface en el proyecto llamado así:
LOCAL_SRC_FILES := FunctionTable.cpp $(PATH_TO_SHARED_PROJECT)/JavaCInterface.cpp
Pero prefiero no hacer esto ya que me llevaría a la necesidad de actualizar cada proyecto dependiente si cambio la arquitectura de JavaCInterface.
que podría crear un nuevo conjunto de firmas de los métodos JNI en cada proyecto local que luego enlazar a los módulos importados. Nuevamente, esto ata las implementaciones demasiado estrechamente.