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

时间:2011-10-05 02:20:46

标签: java android c++ android-ndk

我们目前有一些用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识别它。

所以这是我的问题,

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

1 个答案:

答案 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内容。