2

据我了解Android-NDK-thingy它的工作原理如下:我必须使用一个NativeActivity,它本身调用附加的本机代码来移交一些OpenGL图形上下文。本机部分可以使用此上下文来绘制一些东西。

直到现在我才弄清楚:一些 GUI 元素怎么样?是否有可能从本机代码回调到 Java 只是为了创建一些 UI 元素并可能使用布局?意味着是否可以将标准的 Android GUI 元素也与此类本机代码一起使用?

如果是:如何做到这一点?如果不是:存在哪些替代方案(手动绘制所有内容除外)?

谢谢!

4

1 回答 1

4

如果你想在 openGL 视图上使用 GUI 的东西,我认为使用普通的 Activity 而不是 NativeActivity 会更好。您可以使用名为 GL2JNIActivity 的 Android 示例。检查从 Eclipse 导入它。

您可以在 JNI 库部分(示例中的 JNILib 类)中声明一些本机函数。当您的 GUI 侦听器被调用时,您将调用它。基本上它看起来像这样:

public class GL2JNILib {

 static {
     // Maybe you need to load other relevant libraries here
     System.loadLibrary("gl2jni");
 }

 public static native void init(int width, int height);
 public static native void step();

 /*Add here your native functions to send to the native code*/     
 public static native void buttonClicked();
 //... add other listeners here (i.e: screen touched, etc.)

}

然后在 Activity 本身中(在对应于 JNIActivity 类的示例中),您可以像往常一样加载一个 XML GUI 文件。当您通过 GUI 获得一些输入时,您可以调用在 GL2JNI 类中添加的本机函数。或多或少看起来像这样:

public class GL2JNIActivity extends Activity {

    GL2JNIView mView;
    Button mButton;

    @Override protected void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        mView = new GL2JNIView(getApplication());
        setContentView(mView);
        mButton = (Button)findViewById(R.id.your_button);        
        mButton.setOnClickListener( new Button.OnClickListener(){
            @Override
            public void onClick(View v) {
                mView.buttonClicked();
            }
        });
    }

    /*...*/
}

最后,你必须在原生端实现原生函数:

JNIEXPORT void JNICALL Java_com_android_gl2jni_GL2JNILib_buttonClicked(
            JNIEnv * env, jobject obj)
{
    // will be called when the button is clicked
}
于 2013-02-09T12:04:59.620 回答