如何为Android ndk准备我的.cpp文件来构建它们?

我们目前有一些用c ++编写的图像处理软件,我们的IOS应用程序正在使用它。 我正在尝试将此图像处理代码集成到我使用Android NDK创建的android项目中。

我有我的android项目和sdk所有设置并准备好了。 我也有ndk设置并准备好了。

我正在完成这个教程 (这很棒),我对他为native.c定义代码的部分感到难过,因为它有一个像这样的函数名,

void Java_com_mamlambo_sample_ndk1_AndroidNDK1SampleActivity_helloLog(JNIEnv * env, jobject this, jstring logThis) 

它几乎让我觉得我必须通过所有现有的c ++函数并改变代码以便NDK识别它。

所以这是我的问题,

  1. 我是否必须更改现有的c ++代码才能使其与ndk构建器一起使用? 如果是这样,我需要在代码中更改这项工作的内容是什么?
  2. 有没有办法让Android.mk文件构建一个完整的目录? 我有很多文件,我不想列出每一个文件,以便建立它们。

1)您应该能够在不进行更改的情况下进行构建 ,但是您需要编写一些JNI包装函数来从Java调用它。 希望你有少量的顶级课程,你只需要包装那些。 例如,这是我对(慢慢)写作的游戏所拥有的:

 // android.cpp #include "game.h" #include  namespace { Game* toGame(jlong gamePtr) { return reinterpret_cast(gamePtr); } } extern "C" { jlong Java_com_rarepebble_game3_Game_create(JNIEnv* env, jobject jobj) { Game* g = new Game(); return reinterpret_cast(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类标题,“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内容。