gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 08:13:09 24 4
gpt4 key购买 nike

我们目前有一些用 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) 您应该能够构建 而无需更改,但是您将需要编写一些 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) $(wildcard subdirectory/*.cpp) #etc...

编辑:根据要求,我的 C++ 游戏类 header “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 内容。

关于java - 如何为 Android ndk 准备我的 .cpp 文件来构建它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7656055/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com