据我了解 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/