Android-NDK:从 native 代码创建 GUI 元素

标签 android user-interface opengl-es android-ndk java-native-interface

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

到目前为止我无法解决的问题:一些 GUI 元素怎么样?是否有可能从 native 代码回调到 Java 只是为了创建一些 UI 元素并可能使用布局?这意味着是否可以将标准 Android GUI 元素与此类 native 代码一起使用?

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

谢谢!

最佳答案

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

您可以在 JNI 库部分(示例中的 JNILib 类)中声明一些 native 函数。当你的 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 类中添加的 native 函数即可。或多或少它看起来像这样:

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();
            }
        });
    }

    /*...*/
}

最后,你要在native端实现native函数:

JNIEXPORT void JNICALL Java_com_android_gl2jni_GL2JNILib_buttonClicked(
            JNIEnv * env, jobject obj)
{
    // will be called when the button is clicked
}

关于Android-NDK:从 native 代码创建 GUI 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14497906/

相关文章:

android - ListView 防止滚动时刷新

如果最初为零,Android 不会为 alpha 设置动画

android - 从 Android 预启动报告中禁用 Google Analytics

android - 在安卓模拟器上通过su获取root权限

.net - WPF/Silverlight 文本效果

JAVA GUI - 从 MYSQL 获取并显示数据

c++ - 纹理映射到瓷砖

c# - 用于 Visual Studio 2008 外观的 ToolStripProfessionalRenderer

opengl - 哪个版本的 OpenGL 着色语言相当于 OpenGL ES 3.2 SL?

OpenGL 与 OpenGL ES 以及 OpenGL 1.x 与 OpenGL 2.0 需要学习什么?