【问题标题】:Is there a way to natively access android DPI, without using JNI?有没有办法在不使用 JNI 的情况下本地访问 android DPI?
【发布时间】:2012-07-21 14:46:27
【问题描述】:

我的 android 游戏使用 OpenGL 和 Android NDK。我目前通过从我的 Activity/GLSurfaceView 进行 JNI 本机调用,将必要的 dpi 值作为参数传递。

目前我正在使用:

    // request an instance of DisplayMetrics, say 'dm' from android.
    float densityFactor = dm.density;

    // pass this as a parameter using JNI call
    myCustomNativeMethod(densityFactor); # implementation in a 'game.c' file

我只是想知道是否可以在不使用 JNI 接收它们(参数)的情况下访问 android 环境参数。可能是,导入一些低级别的 NDK 头文件(.h),这将有助于我直接与 UI 系统进行通信或其他什么?

我的意思是:

    #import <android_displayparams.h>
    ...        
    float densityfactor = getDisplayParamDensity(); // <- Is this possible?

注意:这是出于好奇而提出的问题,我知道这样的机制可能不是一个好的做法。

【问题讨论】:

  • 这是否为您解答? stackoverflow.com/q/7594527/517561
  • @Sparky:恐怕不会。我知道 DisplayMatrics 类可以访问适当的值。我想知道是否有本地访问方式。谢谢!
  • 我已经稍微改进了这个问题。
  • 从技术上讲,是的,设备上有配置文件,您可以解析类似的文件,但您不应该这样做,因为它不是一个稳定的 API,并且可能会更改。可以说你也可以避免 jni 使用套接字通信,但这只是愚蠢的。在活动创建时将配置信息从 java 传递到您的本机代码实际上并不是一个足够大的问题来尝试解决。当您必须在时间紧迫的情况下重复执行某些操作,或提供回调或类似的事情时,拥有原生 API 会很好。
  • @HariKrishnaGanji NDK 如此被忽视......一年后,这仍然是不可能的。

标签: android opengl-es android-ndk dpi


【解决方案1】:

使用 Java Activity / GLSurfaceView 设置将 DPI 作为参数传递看起来是最好的解决方案。

如果您使用 NativeActivity,您可以使用以下方式获得 DisplayMetrics.densityDpi

#include <android/configuration.h>
#include <android_native_app_glue.h>
#include <android/native_activity.h>

int32_t getDensityDpi(android_app* app) {
    AConfiguration* config = AConfiguration_new();
    AConfiguration_fromAssetManager(config, app->activity->assetManager);
    int32_t density = AConfiguration_getDensity(config);
    AConfiguration_delete(config);
    return density;
}

很遗憾,没有获取 DisplayMetrics.xdpi 和 DisplayMetrics.ydpi 的 API。

【讨论】:

    猜你喜欢
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-19
    • 2018-06-03
    • 2016-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多