Настройка проекта для работы с android ndk в eclipse

4.9 (1)

Для разработки приложений под android приложения зачастую используется пакет sdk. Но иногда поставленная задача требует для своего решения более специфичное решения.  Такие задачи как обработка сигналов, игровые движки или же симуляция физике требует для себя много вычислительных ресурсов или более тонкой настройки. Для такого рода задач существует еще один пакет разработки, который называется Android  NDK. Данный пакет включает в себя набор инструментов, которые позволяет реализовать часть приложения используя языки программирования С/С++

Но для работы с ndk есть свои моменты которые мы рассмотрим ниже и в заменке мы постараемся создать проект для работы с с/с++ кодом в android приложении.
Для примера будет использоватся среда разработки eclipse под операционной системой Ubuntu 14.04.

Для работы необходимо установить дополнительно плагин CDT


Help → Install new Software
http://download.eclipse.org/tools/cdt/releases/8.6 

Скачиваем и устанавливаем ndk
качаем пакет    https://developer.android.com/tools/sdk/ndk/index.html
установка


chmod a+x ./<имя скаченого файла>.bin
./<имя скаченого файла>.bin

установленный ndk будет в том же каталоге что и bin файл

Создаем обычное приложения для андроид (Android Aplication Project).

Проверяем настроки пути в проекте к sdk, ndk, если они пусты дописываем пути
 


Eclipse -> Window -> Preferences -> Android -> set path to SDK
Eclipse -> Window -> Preferences -> Android -> NDK -> set path to the NDK

В настройках проекта добавляем path variables  NDKROOT и в нее прописываем путь куда был установлен ndk.

настройка проекта android ndk в eclipse

обявляем каталоги jni к нашему проекту Нажмите правой кнопкой мыши на проект и выберите Android Tools -> Add native supportВ результате появится папки и файл для работы с ndk.

В файле Android.mkуказываем имя модуля и src файлов


LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := TestNDK
LOCAL_DEFAULT_CPP_EXTENSION := cpp
LOCAL_SRC_FILES := TestNDK.cpp
include $(BUILD_SHARED_LIBRARY)

Создаем файл Application.mk

В этом файле описаны глобальные настройки для сборки  


APP_STL := stlport_static
APP_MODULES := TestNDK

Создаем файл с прототипами функций TestNDK.h

В этом файле должны быть описаны прототипы функций которые должны быть использованы с учетом вашего пакета в котором хранится класс джавы

Тоесть, если вы назовете относительно библиотеки
 Java_TestNDK_getNumeric
 вместо того что бы 
 Java_com_example_testndk_TestNDK_getNumeric

Будет выдана рантайм екшепшен
и написано no implementation found for native


#include <jni.h>
/* Header for class TestNDK */
#ifndef _Included_TestNDK
#define _Included_TestNDK
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     TestNDK
 * Method:    getNumeric
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_com_example_testndk_TestNDK_getNumeric
  (JNIEnv *, jobject);
/*
 * Class:     TestNDK
 * Method:    getNumericSum
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_com_example_testndk_TestNDK_getNumericSum
  (JNIEnv *, jobject, jint, jint);
#ifdef __cplusplus
}
#endif
#endif

В файле срр описывается реализация


#include <TestNDK.h>
JNIEXPORT jint JNICALL Java_com_example_testndk_TestNDK_getNumeric
  (JNIEnv * env, jobject){
    return 10;
};
JNIEXPORT jint JNICALL Java_com_example_testndk_TestNDK_getNumericSum
  (JNIEnv * env, jobject o, jint a, jint b){
    int i = a+b;
    return i;
};

Теперь можно сделать Build Project нашего проекта. В результате появятся наша библиотека. Для подключения используем имя которое указали в   Android.mk Для вызова методов нужно описать их интерфейс указав при этом  native


package com.example.testndk;
public class TestNDK {
    static {
        try {
            System.loadLibrary("TestNDK");
        } catch (UnsatisfiedLinkError e) {
              System.out.println("UnsatisfiedLinkError " + e.getLocalizedMessage());
        }
    }    
    
    public native int getNumeric();
    public native int getNumericSum(int a, int b);
}

Для более удобной работы есть утилиты javac и javah но нужно смотреть и проверять прототипы функций которые они выдают!

Комментарий (0)

Войдите с помощью соцсетей:
или
введите свои данные: