Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:将Java视图添加到OpenGl视图_Android_Cocos2d X - Fatal编程技术网

Android:将Java视图添加到OpenGl视图

Android:将Java视图添加到OpenGl视图,android,cocos2d-x,Android,Cocos2d X,我已经使用ndk和cocos2dx将我的iphone应用程序移植到android上。 这就像一个魅力,我认为cocos2dx非常酷 现在,我想在Java环境中将一些Java视图添加到我的主opengl视图中。 这对我来说真的不管用。我想我需要了解Java环境中的视图、活动、意图等方面的基本知识 具体来说,我需要在运行时向opengl视图添加一个TextView(java)。 我尝试了以下方法,但当我调用函数voidtestSetText()时,它崩溃了 如果我尝试运行另一个活动,或者调用函数pu

我已经使用ndk和cocos2dx将我的iphone应用程序移植到android上。 这就像一个魅力,我认为cocos2dx非常酷

现在,我想在Java环境中将一些Java视图添加到我的主opengl视图中。 这对我来说真的不管用。我想我需要了解Java环境中的视图、活动、意图等方面的基本知识

具体来说,我需要在运行时向opengl视图添加一个
TextView
(java)。 我尝试了以下方法,但当我调用函数void
testSetText()
时,它崩溃了

如果我尝试运行另一个活动,或者调用
函数public void testSetText()
中的
setContentView(R.layout.test\u screen)
,我的游戏也会崩溃

有谁能给我一些好的建议吗?

更新:
谢谢你,麦卡斯 以下是堆栈跟踪:

08-16 15:19:52.121: INFO/TAG(8352):  canITalktoPIT 
08-16 15:19:52.121: ERROR/MY_APP(8352): test call PIT 2
08-16 15:19:52.203: WARN/dalvikvm(8352): threadid=11: thread exiting with uncaught exception (group=0x40015560)
08-16 15:19:52.214: ERROR/AndroidRuntime(8352): FATAL EXCEPTION: GLThread 10
08-16 15:19:52.214: ERROR/AndroidRuntime(8352): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
08-16 15:19:52.214: ERROR/AndroidRuntime(8352):     at android.view.ViewRoot.checkThread(ViewRoot.java:2932)
08-16 15:19:52.214: ERROR/AndroidRuntime(8352):     at android.view.ViewRoot.requestLayout(ViewRoot.java:629)
08-16 15:19:52.214: ERROR/AndroidRuntime(8352):     at android.view.View.requestLayout(View.java:8267)
08-16 15:19:52.214: ERROR/AndroidRuntime(8352):     at android.view.View.requestLayout(View.java:8267)
08-16 15:19:52.214: ERROR/AndroidRuntime(8352):     at android.view.View.requestLayout(View.java:8267)
08-16 15:19:52.214: ERROR/AndroidRuntime(8352):     at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:257)
08-16 15:19:52.214: ERROR/AndroidRuntime(8352):     at android.view.View.requestLayout(View.java:8267)
08-16 15:19:52.214: ERROR/AndroidRuntime(8352):     at android.view.ViewGroup.addView(ViewGroup.java:1869)
08-16 15:19:52.214: ERROR/AndroidRuntime(8352):     at android.view.ViewGroup.addView(ViewGroup.java:1851)
08-16 15:19:52.214: ERROR/AndroidRuntime(8352):     at dk.comp.testApp.testAppB.calling(testAppB.java:289)
08-16 15:19:52.214: ERROR/AndroidRuntime(8352):     at dk.comp.testApp.SigletonJohn.canITalktoPIT(SigletonJohn.java:43)
08-16 15:19:52.214: ERROR/AndroidRuntime(8352):     at org.cocos2dx.lib.testAppJavaCppComunication.pitTestJNI(testAppJavaCppComunication.java:47)
08-16 15:19:52.214: ERROR/AndroidRuntime(8352):     at org.cocos2dx.lib.Cocos2dxActivity.pitTestJNI(Cocos2dxActivity.java:177)
08-16 15:19:52.214: ERROR/AndroidRuntime(8352):     at org.cocos2dx.lib.Cocos2dxRenderer.nativeTouchesEnd(Native Method)
08-16 15:19:52.214: ERROR/AndroidRuntime(8352):     at org.cocos2dx.lib.Cocos2dxRenderer.handleActionUp(Cocos2dxRenderer.java:49)
08-16 15:19:52.214: ERROR/AndroidRuntime(8352):     at org.cocos2dx.lib.Cocos2dxGLSurfaceView$9.run(Cocos2dxGLSurfaceView.java:288)
08-16 15:19:52.214: ERROR/AndroidRuntime(8352):     at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1326)
08-16 15:19:52.214: ERROR/AndroidRuntime(8352):     at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1118)
08-16 15:19:52.238: WARN/ActivityManager(116):   Force finishing activity dk.comp.testApp/.testAppB
08-16 15:19:52.242: INFO/SOUND(8352):  PAUSE 
08-16 15:19:52.246: INFO/TAG(8352):  onPause


更新#2:
好的,我仍在处理此问题,只是无法修复:( 但我发现了一些有趣的事情:

总结一下我的问题: 我的android应用程序运行了一个cocos2dx场景,效果非常好。当用户按下按钮时:

myBut = CCMenuItemImage::itemFromNormalImage("some.png", "some.png.png", this, menu_selector(Cocos2dMenuScene::butPushed));
我通过JNI调用Java环境,并请求添加某种视图(例如
TextView
)(请参阅
testSetText()
)。此时,我的应用程序崩溃了-崩溃日志:

警告/dalvikvm(8352):threadid=11:线程未捕获退出 异常(组=0x40015560)08-16 15:19:52.214: 错误/AndroidRuntime(8352):致命异常:GLThread 10 08-16 15:19:52.214:错误/AndroidRuntime(8352):

现在,我还使用了在Java端集成的Admob。当Admob通过某个委托(例如onReceiveAd)调用我的主类(myTest见上文)时,我尝试调用
testSetText()
,并在此时添加我的
TextView
,一切正常

所以我认为这与线程有关,但我不是这方面的专家,所以我非常需要一些帮助


有什么建议吗?

我也有同样的问题,但我刚刚修复并意识到android和cocos2d-x发生了什么

基本上,在android系统中,只有创建UI的主线程才能更新UI本身

因此,您需要使用处理程序和消息来通知主线程更新UI

更进一步,当您通过JNI通过c/c++函数调用java方法时

静态方法可能是最佳选择,您可以通过这个JavaVM和env首先获取JavaVM和getstaticmethodid


希望这将对您有所帮助。

这可能太晚了,我不熟悉NDK,但从堆栈跟踪中,我可以理解您的问题是试图从OpenGL线程添加视图(如日志中所述,这是线程11)。您需要在UI线程中运行此方法,如下所示:

public void testSetText(){
    runOnUiThread(new Runnable() {

        @Override
        public void run() {
           Log.e(TAG, "testSetText");    

           TextView textView = new TextView(this);         
           textView.setText("Hello, Android");

           LinearLayout testLayout = new LinearLayout(this);

           RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);        
           lp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
           testLayout.addView(textView ,lp);
           mainFrame.addView(testLayout);
        }
    });
}

我发现了这一点,我想让其他人更容易一点,因为对于那些来到这里的人来说,你可能在寻找一个快速完整的答案来详细说明这个过程

import android.os.Handler;
import android.os.Message;
import android.os.Bundle;
此代码由主线程执行:

// In main thread
Handler handler = new Handler(new Handler.Callback() {
    public boolean handleMessage(Message message) {
        Bundle bundle = message.getData();
        switch (bundle.getInt("type")) {
             case 0:
                String txt = bundle.getString("text");
                my_text_view.setText(txt);
                break;
        }
        return true;
    }
});
// In other thread.
Message msg = handler_variable_passed_to_thread.obtainMessage();
Bundle bundle = new Bundle();
bundle.putInt("type", 0);
bundle.putString("text", "hello world!");
此代码由另一个希望与主线程对话的线程执行:

// In main thread
Handler handler = new Handler(new Handler.Callback() {
    public boolean handleMessage(Message message) {
        Bundle bundle = message.getData();
        switch (bundle.getInt("type")) {
             case 0:
                String txt = bundle.getString("text");
                my_text_view.setText(txt);
                break;
        }
        return true;
    }
});
// In other thread.
Message msg = handler_variable_passed_to_thread.obtainMessage();
Bundle bundle = new Bundle();
bundle.putInt("type", 0);
bundle.putString("text", "hello world!");

系统将传递消息并在为回调创建
处理程序的线程上调用回调,这将使您能够访问该线程的资源。这也可以用于许多其他事情,并且是传递消息的一种非常快速的方式。它不仅限于UI线程交互。

请添加stacktrace。嘿兄弟,你能分享你的代码吗?我也遇到了同样的问题,我也想要同样的东西。这会有很大的帮助!!!我也在尝试集成admob,但不知道如何在场景中访问我的adview?我希望你能帮我解决同样的问题