如何为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识别它。
所以这是我的问题,
- 我是否必须更改现有的c ++代码才能使其与ndk构建器一起使用? 如果是这样,我需要在代码中更改这项工作的内容是什么?
- 有没有办法让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内容。
- android写给sdcard
- java.lang.ArrayIndexOutOfBoundsException:length = 4; index = 4长度数组
- 我如何有效地使用事件总线?
- 使用KeyGenParameterSpec.Builder等效替换KeyPairGeneratorSpec – 密钥库操作失败
- 如何在不崩溃的情况下处理来自jni的AudioTrack调用?
- Android:暂停/恢复计时器或线程
- 在动态创建的片段之间进行通信,从而产生空指针exception
- RecyclerView单项ID
- 在推送通知错误“notificationBuilder.setContentText(currentText).setNumber(++ numMessages);”中找不到符号