Android NDK捕获关键事件 我有一个Android NDK游戏(NDK 4)。几乎所有代码都是C++(它是一个端口),所以在java中,我拥有的是一个活动,一个GoSurvivEw,它覆盖了OnTouChEvices。我试图弄清楚如何接收按键事件,以便将它们转发到要处理的本机代码

Android NDK捕获关键事件 我有一个Android NDK游戏(NDK 4)。几乎所有代码都是C++(它是一个端口),所以在java中,我拥有的是一个活动,一个GoSurvivEw,它覆盖了OnTouChEvices。我试图弄清楚如何接收按键事件,以便将它们转发到要处理的本机代码,java,android,android-ndk,Java,Android,Android Ndk,我尝试让视图实现OnKeyListener,但从未调用onKey()。还尝试在视图中重写onKeyDown()和onKeyUp(),但未成功。我错过什么了吗 更新 我当前使用的视图: public class FooView extends GLSurfaceView implements SurfaceHolder.Callback, OnKeyListener { private GameRenderer _renderer; private GameListener _li

我尝试让视图实现OnKeyListener,但从未调用onKey()。还尝试在视图中重写onKeyDown()和onKeyUp(),但未成功。我错过什么了吗

更新

我当前使用的视图:

public class FooView extends GLSurfaceView implements SurfaceHolder.Callback, OnKeyListener
{
    private GameRenderer _renderer;
    private GameListener _listener;

    public FooView(Context context)
    {
        super(context);
        this._renderer = new GameRenderer();
        setRenderer(this._renderer);
        this._listener = new GameListener(context);
        BaseLib.setListener(this._listener);
    }

    @Override
    public boolean onTouchEvent(final MotionEvent event)
    {
        // touch code...
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)
    {
        Log.d("testing", "onKeyDown event from Java");
        return super.onKeyDown(keyCode, event);
    }

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event)
    {
        Log.d("testing", "onKeyUp event from Java");
        return super.onKeyUp(keyCode, event);
    }

    @Override
    public boolean onKey(View view, int keyCode, KeyEvent event)
    {
        Log.d("testing", "onKey event from Java");
        return true;
    }
}
(从内存输入,因此语法可能不是100%,但是…)根据我的评论。。。你在做这个

类myAct扩展活动实现View.onKeyListener

myButton.setOnKeyListener(此)

尝试以下操作:

  @Override
  public boolean dispatchKeyEvent(KeyEvent event)
  {
          //
          // SEND event.getAction() to your NDK code
          //
          if(<NDK CODE PROCESSED IT>) return true;

          // default behavior for everything else
          return super.dispatchKeyEvent(event);
  }
@覆盖
公共布尔dispatchKeyEvent(KeyEvent事件)
{
//
//将event.getAction()发送到NDK代码
//
if()返回true;
//其他一切的默认行为
返回super.dispatchKeyEvent(事件);
}

您需要在添加事件侦听器时将(此)传递到视图(假设您的活动实现了onKeyListener),是否可以发布一些您正在使用的java端代码,特别是在看到onKeyListener的地方?假设德雷德尔博士的建议不是问题。键盘上下键应该可以工作…@Maximus这是我所期望的,但我没有看到任何东西,我没有一个按钮可以连接。OpenGL直接绘制到曲面。看来我的问题是我需要调用setOnKeyListener()来处理某些事情。我可以用视图本身来做吗?对于键盘上键入的每个字符,通过JNI的开销是多少?我发现这会带来巨大的开销。JNI调用肯定会有成本,但我不认为成本会那么高:我希望如果您看到意外的延迟,可能是平台问题(可能是模拟器的问题?),或者您的代码可能在处理击键时做了大量工作。没有更多细节很难说。也就是说,我认为较新的Android平台完全支持本机活动实现,没有Java层():您可以从中获得更多。