1) 당신은 변경없이 빌드 할 수 있어야한다, 그러나 당신은 자바에서 호출하는 그 JNI 래퍼 기능의 일부를 작성해야합니다. 다행스럽게도 소수의 최상위 클래스를 보유하고 있으므로이를 래핑하면됩니다. 예 : 이 내 com.rarepebble.game3.Game
클래스에서 이러한 기능을 선언하고 응용 프로그램의 수명주기에 적절한 시간에 그들을 호출 할 수있는 자바 측면에서
// 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.
}
: 저는 여기에 게임 난 (천천히) 쓰기를 위해있는거야. (++ 자바 패키지, 클래스와 함수 이름이 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을 사용할 수 있습니다 : = $ (와일드 카드 * cpp를) $ (와일드 카드 하위 디렉토리 /*.cpp) #etc ...
이
편집 : 요청으로, 내 C++ 게임 클래스 헤더, "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를 포함시키지 마십시오.
Martin이 도움을 주셔서 감사합니다. 그 예제는 아직 NDK 튜토리얼에서 본 일부 베스트입니다. 그래서 "Java_com_rarepebble_game3_Game_update"와 같은 함수는 C++ 함수의 이름이 필요합니다. "Java_packages_function"과 같은 것입니까? – Metropolis
예, 정확하게. 'Java_' 이후의 모든 것은 자바처럼 보이기를 원하는 전체 패키지, 클래스, 함수 이름과 일치해야합니다. Java에서 클래스를 정의하고 그 안에'private native etc ... '선언을 추가해야합니다. (나는이 대답을 더 명확하게하기 위해 편집하고있다.) –
굉장하다. 그래서 나는 기본적으로 모든 C++ 파일을 검토하고 "Java_package_function"과 일치하는 이름을 변경해야한다. 또한 헤더 파일을 ndk 빌드에 포함시켜야합니까? 또는 .cpp 파일 만? – Metropolis