小编Sca*_*cam的帖子

Crashlytics NDK符号从命令行建立

我正在尝试将Crashlytics支持添加到我的Android项目中,该项目使用NDK和gradle CMake.这意味着我需要符号来共享我的共享项目.所以,如果我想创建发布版本的符号,我会打电话gradlew crashlyticsUploadSymbolsRelease

https://docs.fabric.io/android/crashlytics/ndk.html中的官方文档说符号生成和上传过程采用标准项目结构:src/main/obj用于调试二进制文件,src/main/libs对于由ndk-build生成的发布二进制文件.

在gradle文件中,这意味着一个新的块,如下所示:

crashlytics {
    enableNdk true
    androidNdkOut 'src/main/obj'
    androidNdkLibsOut 'src/main/libs'
}
Run Code Online (Sandbox Code Playgroud)

因为我使用gradle CMake集成来构建我的本机库,所以默认路径当然不起作用.我在发布模式下的本机库内置在一个build/intermediates/cmake/release/obj目录中,在调试模式下它们会进入build/intermediates/cmake/debug/obj目录.

从试验和错误中我发现,如果我希望我的发布版本能够工作,我将不得不将发布模式本机库的路径放入两行,如下图所示.

crashlytics {
    enableNdk true
    androidNdkOut 'build/intermediates/cmake/release/obj'
    androidNdkLibsOut 'build/intermediates/cmake/release/obj'
}
Run Code Online (Sandbox Code Playgroud)

我真的不明白androidNdkOutandroidNdkLibsOut变量之间的区别,因为至少在我的场景中他们指向同一个目录.幸运的是,这对我来说不是问题,因为我只需要Crashlytics来处理我的发布二进制文件.

所以我的问题是:

1)androidNdkOut和之间的真正区别是androidNdkLibsOut什么?为什么我不能在一个路径中放置调试二进制文件的路径以及将二进制文件发布到其他路径?除了解释之外,一个具体的例子会很好.

2)如果有一天我想要为我的调试库包含符号,我应该如何修改我的gradle文件?意味着命令 gradlew crashlyticsUploadSymbolsRelease以及gradlew crashlyticsUploadSymbolsDebug将起作用?

Crashlytics NDK符号和Gradle任务以及Crashlytics NDK多androidNdkOut路径支持的线程中有关于此的讨论,但他们实际上没有回答这两个问题.

cmake android-ndk android-gradle-plugin crashlytics-android

6
推荐指数
1
解决办法
2321
查看次数

SDL2:调整窗口大小时如何保持纵横比

我正在尝试创建一个 SDL 窗口,该窗口在调整大小事件发生时保持其纵横比。如果用户加宽窗口,则高度增加,反之亦然。我捕获 SDL_WINDOWEVENT_RESIZED 事件,计算保持纵横比的新宽度或高度,然后使用计算值调用 SDL_SetWindowSize()。

问题是在事件轮询循环内调用 SDL_SetWindowSize() 函数在屏幕上没有任何作用。SDL 确实更新了窗口大小变量(在我的主循环中调用 SDL_GetWindowSize() 返回更新的窗口尺寸)。但是,实际窗口不会更新。

我可以让它工作的唯一方法是在主循环中不断调用 SDL_SetWindowSize() ,但我认为这是错误的做事方式。下面的代码说明了我的问题。有没有更好更干净的方法来让它工作?

我在 GNOME 桌面上使用 SDL 2.0.3 和 64 位 Ubuntu Linux。

#include <SDL2/SDL.h>

static const float ASPECT_RATIO = 16.f/9.f;

SDL_Window* window;
SDL_Renderer* renderer;

uint32_t windowID;
SDL_Rect screen;
bool done = false;
bool resizeDone = false;

void handle_events()
{
    SDL_Event e;
    while (SDL_PollEvent(&e)) {
        switch (e.type) {

        case SDL_WINDOWEVENT: 
            if(e.window.windowID == windowID) {
                switch(e.window.event) {
                    case SDL_WINDOWEVENT_RESIZED: { 
                        int width = e.window.data1;
                        int height = e.window.data2;
                        float …
Run Code Online (Sandbox Code Playgroud)

c++ linux sdl sdl-2

5
推荐指数
1
解决办法
4655
查看次数

使用android NativeActivity时从SoftInput接收所有unicode字符

我有一个 OpenGL 应用程序,它使用NativeActivity. 当我询问用户姓名时,我通过JNI调用一个java方法为我打开一个软件键盘。游戏在 OpenGL 上下文中显示了它自己的原生文本输入对话框。所有 unicode 字符都应该在名称中可用。

public static void JNI_keyboardShow() {
    InputMethodManager imm = (InputMethodManager)Main.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.showSoftInput(m_window.getDecorView(), InputMethodManager.SHOW_IMPLICIT);
}
Run Code Online (Sandbox Code Playgroud)

我的 java 类扩展,KeyEvent.Callback所以我通过覆盖onKeyDown(int keyCode, KeyEvent event)onKeyMultiple(int keyCode, int count, KeyEvent event)方法接收键盘输入。然后我通过 JNI 将接收到的输入传递给我的 C++ 应用程序。

我的问题是在方法中处理非 ascii unicode 字符onKeyMultiple。它看起来像这样:

@Override
public boolean onKeyMultiple (int keyCode, int count, KeyEvent event) {
    int unicode = event.getUnicodeChar();
    Log.e(TAG, "Unicode: " + unicode);

    String text = null;
    if(event.getAction() == KeyEvent.ACTION_MULTIPLE && keyCode == KeyEvent.KEYCODE_UNKNOWN) …
Run Code Online (Sandbox Code Playgroud)

c++ java unicode android android-ndk

5
推荐指数
1
解决办法
991
查看次数

Linux中的SDL桌面分辨率检测

我有一些报告说,对于一些Linux用户,特别是那些使用SteamOS的用户,我的游戏分辨率错误.游戏尝试检测当前桌面分辨率并使用该分辨率创建无边框全屏窗口.

例如,SteamOS的分辨率通常为1920x1080,但SDL报告它类似于4096x2160!因此,当游戏开始时,玩家仅看到游戏区域的左下部分.

我检测屏幕分辨率的功能如下:

bool View::checkDisplaySize() {
    int display_count = 0;
    int display_index = 0;
    int mode_index = 0;
    SDL_DisplayMode mode = { SDL_PIXELFORMAT_UNKNOWN, 0, 0, 0, 0 };

    if ((display_count = SDL_GetNumVideoDisplays()) < 1) {
        printf("SDL_GetNumVideoDisplays returned: %i", display_count);
        return false;
    }

    if (SDL_GetDisplayMode(display_index, mode_index, &mode) != 0) {
        printf("SDL_GetDisplayMode failed: %s", SDL_GetError());
        return false;
    }

    m_display.w = mode.w;
    m_display.h = mode.h;

    return true;
}
Run Code Online (Sandbox Code Playgroud)

然后,我使用存储在m_displaystruct中的信息进入全屏.窗口创建和全屏显示在不同的功能中,因为使用其他Linux发行版而不是SteamOS的玩家也可以选择在游戏过程中进入窗口模式:

window = SDL_CreateWindow("Game", 0, 0, m_display.w, m_display.h, window_flags);
Run Code Online (Sandbox Code Playgroud)

...

SDL_SetWindowBordered(window, SDL_FALSE);
SDL_SetWindowPosition(window, …
Run Code Online (Sandbox Code Playgroud)

c++ linux screen-resolution sdl-2

3
推荐指数
1
解决办法
389
查看次数

Win32:将黑色边框添加到全屏窗口

我试图在Windows中保持全屏模式下的内容宽高比.如果显示宽高比与内容宽高比不同,我想将桌面的其余部分隐藏在黑色边框后面.是否可以使用Win32 api创建具有居中内容和黑色边框的全屏窗口?

在OS X中,使用以下代码可以很容易地实现:

CGSize ar;
ar.width = 800;
ar.height = 600;
[self.window setContentAspectRatio:ar];
[self.window center];
[self.window toggleFullScreen:nil];
Run Code Online (Sandbox Code Playgroud)

如果我在16:9显示器上运行上面的代码,我的应用程序进入全屏模式,内容居中(因为它是4:3)并且我在屏幕的两侧都有黑色边框.

我试图在Windows中实现相同的功能,但我开始怀疑它是否可能.我当前的全屏代码保持宽高比并使内容居中,但如果fullscreenWidthfullscreenHeight不等于displayWidth和,则显示窗口两侧的桌面displayHeight:

bool enterFullscreen(int fullscreenWidth, int fullscreenHeight)
{
    DEVMODE fullscreenSettings;
    bool isChangeSuccessful;

    int displayWidth = GetDeviceCaps(m_hDC, HORZRES);
    int displayHeight = GetDeviceCaps(m_hDC, VERTRES);

    int colourBits = GetDeviceCaps(m_hDC, BITSPIXEL);
    int refreshRate = GetDeviceCaps(m_hDC, VREFRESH);

    EnumDisplaySettings(NULL, 0, &fullscreenSettings);
    fullscreenSettings.dmPelsWidth = fullscreenWidth;
    fullscreenSettings.dmPelsHeight = fullscreenHeight;
    fullscreenSettings.dmBitsPerPel = colourBits;
    fullscreenSettings.dmDisplayFrequency = refreshRate;
    fullscreenSettings.dmFields = DM_PELSWIDTH |
        DM_PELSHEIGHT |
        DM_BITSPERPEL …
Run Code Online (Sandbox Code Playgroud)

c++ winapi window fullscreen

0
推荐指数
1
解决办法
562
查看次数