Как мне подготовить мои .cpp файлы для Android ndk, чтобы собрать их? - PullRequest
2 голосов
/ 05 октября 2011

В настоящее время у нас есть некоторое программное обеспечение для обработки изображений, написанное на c ++, которое используется нашим приложением IOS. Я пытаюсь интегрировать этот код обработки изображений в проект Android, который я создал с помощью Android NDK.

У меня есть проект Android и SDK все готово и готово к работе. У меня также есть настройка ndk, и я готов к работе.

Я продолжал этот урок (что удивительно), и я был озадачен тем, что он определил код для native.c, потому что у него было имя функции, подобное этому,

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

Мне кажется, что мне нужно пройти через все мои существующие функции c ++ и изменить код, чтобы NDK мог его распознать.

Итак, вот мои вопросы,

  1. Должен ли я изменить свой существующий код на С ++, чтобы он работал с компоновщиком ndk? И если да, что мне нужно изменить в своем коде для этой работы?
  2. Есть ли способ заставить файл Android.mk создать весь каталог? У меня много файлов, и я не хотел перечислять каждый из них, чтобы их собрать.

1 Ответ

4 голосов
/ 05 октября 2011

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...