QNetwork error cuando se utiliza Qt lib con la aplicación JNI Android nativa
Tengo la lib de Qt simple que hace la petición del HTTP como esto:
QNetworkAccessManager networkAccessManager; QNetworkRequest request{QUrl("http://www.google.ru")}; QNetworkReply * reply = networkAccessManager.get(request); ...
Todo funciona bien cuando lo ejecuto en dispositivos Android ( armeabi-v7a
y x86
) diractly de Qt Creator. Pero quiero usarlo dentro de la aplicación nativa de Android con NDK
y JNI
. En este caso, sólo funciona en dispositivos armeabi-v7a
y con Android desde la versión 6.0. Si ejecuto la aplicación android con esta lib en el dispositivo x86
se bloquea con el siguiente mensaje:
- La ventana principal no recibe eventos después de cerrar el diálogo modal
- ¿Cómo mantener la pantalla encendida en Qt para Android?
- Qt Creator 3.2.1 incluyendo .jar para Android
- ¿Hay un #ifdef en Qt para determinar si estamos construyendo para Android
- Qt5.1-android: Qt versión para mips que faltan en QtCreator
Señal fatal 11 (SIGSEGV) en 0x00000000 (código = 1), subproceso 11830 (itekllc.testjni)
Y ocurre en esta línea de código dentro de mi Qt lib:
QNetworkReply * reply = networkAccessManager.get(request);
Este es mi archivo communication.cpp
en el proyecto androide nativo:
#include <jni.h> #include "QCoreApplication" #include "testandroidthreadslib.h" #ifndef _Included_com_navitekllc_testjni_CppWrapper #define _Included_com_navitekllc_testjni_CppWrapper #ifdef __cplusplus extern "C" { #endif JNIEXPORT void JNICALL Java_com_navitekllc_testjni_CppWrapper_testNetwork(JNIEnv *env, jclass type) { TestAndroidThreadsLib testLib; testLib.run(); } #ifdef __cplusplus } #endif #endif
Este es mi archivo .java
para llamar a la función .cpp
:
public class CppWrapper { public static native void testNetwork(); static { System.loadLibrary("communication"); } }
Este es mi build.gradle
experemental gradle archivo:
apply plugin: 'com.android.model.application' model { repositories { libs(PrebuiltLibraries) { QtStaticLibrary { headers.srcDir file("..PathToLib/TestAndroidThreadsLib").absolutePath binaries.withType(StaticLibraryBinary) { def myStaticLibPath = "src/main/jniLibs/${targetPlatform.getName()}/libTestAndroidThreadsLib.a" staticLibraryFile = file("${myStaticLibPath}") } } QCoreSharedLibrary { binaries.withType(SharedLibraryBinary) { def coreLibPath = "src/main/jniLibs/${targetPlatform.getName()}/libQt5Core.so" sharedLibraryFile = file("${coreLibPath}") } } QNetSharedLibrary { binaries.withType(SharedLibraryBinary) { def networkLibPath = "src/main/jniLibs/${targetPlatform.getName()}/libQt5Network.so" sharedLibraryFile = file("${networkLibPath}") } } } } android { compileSdkVersion 23 buildToolsVersion "23.0.3" defaultConfig { minSdkVersion.apiLevel 18 targetSdkVersion.apiLevel 21 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles.add(file('proguard-rules.pro')) } } sources { main { jni { dependencies { library "QtStaticLibrary" linkage "static" library "QCoreSharedLibrary" linkage "shared" library "QNetSharedLibrary" linkage "shared" } } } } ndk { moduleName = "communication" cppFlags.add("-std=c++11") stl "gnustl_shared" cppFlags.add('-I' + file("/Volumes/Transcend/Qt/5.7/android_armv7/include").absolutePath) cppFlags.add('-I' + file("/Volumes/Transcend/Qt/5.7/android_armv7/include/QtCore").absolutePath) abiFilters.addAll([ "x86", "armeabi-v7a" ]) } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:24.2.1' }
Sería genial si alguien le dijera lo que estoy haciendo mal y por qué el error en esta línea de código:
QNetworkReply * reply = networkAccessManager.get(request);
Sólo se produce en los dispositivos x86
y en dispositivos con Android versión menos de 6,0 y sólo desde el proyecto nativo de Android (de QtCreator todo funciona sin errores). Gracias por la ayuda.
- No se puede emitir señal en Android
- Cómo importar bibliotecas compartidas en Cmake para Android
- Quiero construir una aplicación de videojuegos para android y ios, pero estoy preocupado por dónde empezar
- ¿Cómo construir el complemento de MySQL para Qt android?
- Actividad de Android / Intención vs. Qt Signal / Slot vs. iPhone? /?
- Versión Qt / QML del kernel
- QPushButton ha duplicado texto después de la actualización Qt
- Qt Android: ¿Por qué se crea QtApp-debug.apk para una versión de Release?
- RecyclerView para la aplicación de chat
- Android: ClassNotFoundException al usar el proyecto de biblioteca que tiene dependencias de gradle