7

c経由で画面サイズを取得したい。私は、jniがcからJavaを呼び出すことをサポートしていることを知っています. しかし、別の方法を知っている人はいますか?javaを呼び出さずに低レベルモジュールから画面サイズを取得することを意味します。

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;

public class MainActivity extends Activity
{

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
    super.onCreate(savedInstanceState);
    Log.v("getWidth", Integer.toString(getWindowManager().getDefaultDisplay().getWidth()));
    Log.v("getHeight", Integer.toString(getWindowManager().getDefaultDisplay().getHeight()));
    }
}

/dev/graphics が私の質問に関連していると思います

4

6 に答える 6

3

はい、/dev/graphics/fb0 から画面解像度を取得できますが、(少なくとも私の電話では) 読み取りアクセスは root と「graphics」グループのユーザーに制限されています。いずれにせよ、次のようなことができます (わかりやすくするためにエラー チェックは削除されています)。

// ... other standard includes ...
#include <sys/ioctl.h>
#include <linux/fb.h>

//...

struct fb_var_screeninfo fb_var;
int fd = open("/dev/graphics/fb0", O_RDONLY);
ioctl(fd, FBIOGET_VSCREENINFO, &fb_var);
close(fd);
// screen size will be in fb_var.xres and fb_var.yres

Google が「Android は Linux 上で実行され、Linux フレームバッファ インターフェイスを使用する」ことをパブリック API の一部と見なしているかどうかはわからないため、これらが「パブリック」NDK インターフェイスと見なされるかどうかはわかりませんが、仕事。

移植可能であることを確認したい場合は、おそらく Java WindowManager API を呼び出す JNI フォールバックが必要です。

于 2012-08-26T22:18:49.370 に答える
0

APP_CMD_INIT_WINDOWネイティブ アクティビティで次のように「アプリ コマンド」を処理しているときに、ウィンドウ サイズを取得することもできます。

static void engine_handle_cmd(struct android_app* app, int32_t cmd) {
struct engine* engine = (struct engine*)app->userData;
switch (cmd) {
case APP_CMD_INIT_WINDOW:
    if (engine->app->window != NULL) {
        int width = ANativeWindow_getWidth(engine->app->window);
        int height = ANativeWindow_getHeight(engine->app->window);
    }

構造体とコールバックの設定方法を知りたい場合main.cは、サンプル NDK プロジェクトを確認してください。native-activityengineengine_handle_cmd

于 2014-06-05T20:43:41.000 に答える
0

バッファは必要ありませんが、Java から Surface を渡す場合は ANativeWindow クラスを使用できます。

void Java_com_justinbuser_nativecore_NativeMethods_setSurface(JNIEnv * env, jobject this, jobject surface){
        ANativeWindow nativeWindow = ANativeWindow_fromSurface(env, surface);
    int width =  ANativeWindow_getWidth(renderEngine->nativeWindow);
    int height = ANativeWindow_getHeight(renderEngine->nativeWindow);
}
于 2012-11-24T14:39:20.797 に答える
0

これを行うための純粋な C++ の方法を探している私のような人にとって、読み取り/dev/graphics/fb0は確実に機能しません。多くのデバイスでは、間違った結果が返されます (私のデバイスでは 640 X 400 が返されます)。

これは、ネイティブ バイナリ実行可能ファイルなど、ANativeWindowまたはを使用できない状況で問題になります。ANativeWindow_Buffer

私のために働いたもの:

ルート化された電話があると仮定すると、以下のコマンドの出力を処理して、解像度を確実に読み取ることができます。

su -c dumpsys display | grep mBaseDisplayInfo
于 2019-10-25T18:08:12.250 に答える
-1

画面解像度を取得するには、 struct を使用する必要がありますANativeWindow_Buffer

typedef struct ANativeWindow_Buffer {
    // The number of pixels that are show horizontally.
    int32_t width;

    // The number of pixels that are shown vertically.
    int32_t height;

    // The number of *pixels* that a line in the buffer takes in
    // memory.  This may be >= width.
    int32_t stride;

    // The format of the buffer.  One of WINDOW_FORMAT_*
    int32_t format;

    // The actual bits.
    void* bits;

    // Do not touch.
    uint32_t reserved[6];
} ANativeWindow_Buffer;

それを取得するには、関数を使用しますANativeWindow_lock

/**
 * Lock the window's next drawing surface for writing.
 */
int32_t ANativeWindow_lock(ANativeWindow* window, ANativeWindow_Buffer* outBuffer, ARect* inOutDirtyBounds);

ここにドキュメントがあります。

この関数の使用法を探している場合は、 という android-ndk サンプルをご覧くださいnative-plasma

于 2012-08-27T21:19:18.040 に答える