Для разработки приложений под 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.
обявляем каталоги 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)