Android NDK / JNI Quickstart

Este é um tutorial sobre como criar um projeto “Hello World” no Android usando o NDK. Ele pressupõe que você está usando o Eclipse-ADT (do Google). O objetivo não é detalhar como funciona o JNI, mas apenas dar um exemplo.

  • Crie um novo projeto Android no Eclipse-ADT

  • Crie uma pasta chamada ” jni ” no projeto (no mesmo nível que ” src ” ou ” res “). Esta pasta conterá todos os arquivos C / C ++

  • Crie ” jni / Android.mk ” com o seguinte conteúdo. Na verdade, é o makefile usado pelo Android para compilar seu código nativo

    LOCAL_PATH := $(call my-dir)

    include $
    (CLEAR_VARS)
    LOCAL_MODULE
    := helloJNI

    LOCAL_LDLIBS
    := -llog
    include $
    (BUILD_SHARED_LIBRARY)
  • (Opcional, mas necessário, por exemplo, com OpenCV): Crie ” jni / Application.mk ” com o seguinte conteúdo:

    APP_STL := gnustl_static
    APP_CPPFLAGS
    := -frtti -fexceptions
    APP_ABI
    := all
  • Em sua atividade (arquivo Java), inclua a biblioteca C ++ que você vai criar

    public class MainActivity extends Activity {
    static {
    System.loadLibrary("helloJNI");
    }
    […]
  • Declare um protótipo nativo que será usado para chamar a função C / C ++ correspondente na biblioteca ” helloJNI “, como:

    private native void debugMessage();
  • Na verdade, chame essa função do Java seu código, por exemplo:

    @Override
    protected void onResume() {
    super.onResume();
    debugMessage
    ();
    }
  • Crie a “cola” JNI entre o código Java e sua equivalência C / C ++:

    • Vá para <your_project> / bin / classes
    • Execute o seguinte comando: javah -o ../../jni/mainActivity.h com.example.hellojni.MainActivity
  • Agora você tem um novo arquivo – mainActivity.h – em <your_project> / jni (pode ser necessário atualizar no Eclipse).

  • Crie <seu projeto> /jni/mainActivity.cpp ( NOTA: os protótipos já são gerados em mainActivity.h por javah_)

    #include "mainActivity.h"
    #include <android/log.h>

    //==============================
    // Declarations
    //==============================
    #define LOG_TAG "mainActivity.cpp"
    #define DPRINTF(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)
    #define IPRINTF(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
    #define EPRINTF(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)

    JNIEXPORT
    void JNICALL JNICALL Java_com_example_hellojni_MainActivity_debugMessage
    (JNIEnv *, jobject)
    {
    DPRINTF
    ( "%sn", __FUNCTION__ );
    DPRINTF
    ( "This is a debug message coming from my C++ code!n");
    }
  • Adicione o novo arquivo cpp que você criou ao Android.mk:

    LOCAL_SRC_FILES := mainActivity.cpp
  • Android.mk agora se parece com:

    LOCAL_PATH := $(call my-dir)

    include $
    (CLEAR_VARS)
    LOCAL_MODULE
    := helloJNI
    LOCAL_SRC_FILES
    := mainActivity.cpp

    LOCAL_LDLIBS
    := -llog
    include $
    (BUILD_SHARED_LIBRARY)
  • Adicione C / C ++ Nature ao seu projeto:
    Clique com o botão direito em seu projeto> Ferramentas Android> Adicionar suporte nativo …

  • Execute seu aplicativo