我们目前有一些用c ++编写的图像处理软件,我们的IOS应用程序正在使用它。我正在尝试将此图像处理代码集成到我使用Android NDK创建的android项目中。
我有我的android项目和sdk所有设置并准备好了。我也有ndk设置并准备好了。
我正在关注this tutorial(这很棒),我对他为native.c定义代码的部分感到难过,因为它有一个像这样的函数名,
void Java_com_mamlambo_sample_ndk1_AndroidNDK1SampleActivity_helloLog(JNIEnv * env, jobject this, jstring logThis)
我几乎认为我必须完成所有现有的c ++函数并更改代码才能让NDK识别它。
所以这是我的问题,
答案 0 :(得分:4)
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:= $(通配符* .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内容。