34 votes

Utiliser C++ avec Android ndk/jni

Tous les échantillons ndk n'utilisent que des fonctions C de base déclarées comme extern dans l'en-tête et définies dans le fichier cpp. Ensuite, après avoir inclus le fichier d'en-tête dans le fichier C contenant le callback jni, tout fonctionne bien.

Est-il possible d'utiliser des classes C++ avec le ndk Android ? Mon application ne sera pas une activité native, elle aura toujours une partie java importante mais elle fera appel à du code C natif pour les calculs intensifs du CPU (déjà écrit en C++, avec des classes et autres trucs C++).

Voici ma strcuture de type hello-world pour le moment :

Fichier "first.h"

#ifndef FIRST_H
#define FIRST_H

class Test
{};

#endif /* FIRST_H */

Fichier "second.cpp"

#include <jni.h>
#include "first.h"

#ifdef __cplusplus
extern "C" {
#endif

jint Java_com_example_twolibs_TwoLibs_add( JNIEnv*  env,
                                      jobject  this,
                                      jint     x,
                                      jint     y )
{
    Test t;
    return 0;
}

#ifdef __cplusplus
}
#endif

Et enfin Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := libtwolib-second
LOCAL_SRC_FILES := second.cpp

include $(BUILD_SHARED_LIBRARY)

Assez basique mais qui ne se compile pas. Transformer second.cpp en fichier .c soulève une erreur lors de l'inclusion du fichier d'en-tête, je suppose que c'est parce que ce n'est pas un fichier C++.

error: expected '=', ',', ';', 'asm' or '__attribute__' before 'Test'

En le transformant en .cpp, on obtient l'erreur suivante :

make: *** No rule to make target `/cygdrive/c/android-ndk-r5c/samples/twolibs/jni/second.c', needed by `/cygdrive/c/android-ndk-r5c/samples/two-libs/obj/local/armeabi/objs/twolib-second/second.o'.  Stop.

Une idée de comment je peux faire compiler ce truc ?

Merci

0voto

Modifier Android.mk

Modifiez les instances de LOCAL_SRC_FILES et supprimez le ./ du début de chaque ligne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X