1) Вы должны быть в состоянии собрать без изменений, но вам потребуется написать некоторые из этих функций-оболочек JNI для вызова его из Java.Надеюсь, у вас есть небольшое количество классов верхнего уровня, и вам нужно будет только обернуть их.Например, вот что у меня есть для игры, которую я (медленно) пишу:
// android.cpp
#include "game.h"
#include <jni.h>
namespace {
Game* toGame(jlong gamePtr) {
return reinterpret_cast<Game*>(gamePtr);
}
}
extern "C" {
jlong Java_com_rarepebble_game3_Game_create(JNIEnv* env, jobject jobj) {
Game* g = new Game();
return reinterpret_cast<jlong>(g);
}
void Java_com_rarepebble_game3_Game_destroy(JNIEnv* env, jobject jobj, jlong gamePtr) {
delete toGame(gamePtr);
}
void Java_com_rarepebble_game3_Game_update(JNIEnv* env, jobject jobj, jlong gamePtr, jboolean isTouching, jfloat touchX, jfloat touchY) {
toGame(gamePtr)->update(isTouching, touchX, touchY);
}
void Java_com_rarepebble_game3_Game_render(JNIEnv* env, jobject jobj, jlong gamePtr) {
toGame(gamePtr)->render();
}
// ... and a few others. Only one class, though.
}
На стороне Java это позволяет мне объявлять эти функции в моем классе com.rarepebble.game3.Game
и вызывать их в подходящее время вжизненный цикл приложения.(Обратите внимание, что имена пакетов Java, классов и функций соответствуют именам функций в C ++):
//Game.java
package com.rarepebble.game3;
// (imports)
public class Game {
static {
System.loadLibrary("game3lib");
}
// These are the functions you defined in C++
private native long create();
private native void destroy(long gamePtr);
private native void update(long gamePtr, boolean isTouched, float x, float y);
private native void render(long gamePtr);
private long gamePtr = 0;
Game() {
gamePtr = create();
}
@Override
protected void finalize() throws Throwable {
if (gamePtr != 0) {
destroy(gamePtr);
}
super.finalize();
}
// etc...
}
2) Вы можете использовать
LOCAL_SRC_FILES: = $ (wildcard * .cpp)$ (подкаталог подстановочного знака / *. cpp) #etc ...
Редактировать: По запросу мой заголовок класса C ++ Game, "game.h":
// game.h
#ifndef GAME_INCLUDED
#define GAME_INCLUDED
// Various game and standard library includes.
// *NO* JNI or Android includes.
namespace game {
class Game {
public:
Game();
~Game();
void update(bool isTouching, float touchX, float touchY);
void render();
// other funcs...
private:
// etc...
};
}
#endif //def GAME_INCLUDED
Точно так же "game.cpp" также не содержит JNI.