Java 使用带NDK的TextureView发布

Java 使用带NDK的TextureView发布,java,android,c++,android-ndk,Java,Android,C++,Android Ndk,我正在编写一小段代码,使用TextureView显示MediaPlayer的结果 我在尝试使用NDK混合托管代码和本机代码时遇到了一个问题。 如果我的活动继承自NativeActivity而不是Activity,则我的应用程序已损坏 这是已知的限制吗?它与NDK胶水有关吗 这是我的活动代码: public class SurfaceActivity extends NativeActivity { private static final boolean VERBOSE = tr

我正在编写一小段代码,使用TextureView显示MediaPlayer的结果

我在尝试使用NDK混合托管代码和本机代码时遇到了一个问题。 如果我的活动继承自NativeActivity而不是Activity,则我的应用程序已损坏

这是已知的限制吗?它与NDK胶水有关吗

这是我的活动代码:

public class SurfaceActivity extends NativeActivity {

    private static final boolean VERBOSE    = true;
    private static final String TAG         = "native";

    private static final String FILES_DIR   = "/sdcard/";
    private static final String INPUT_FILE  = "video1.mp4";

    TextureView mView       = null;
    MediaPlayer mPlayer     = new MediaPlayer();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        try {
            File inputFile = new File(FILES_DIR, INPUT_FILE);
            mPlayer.setDataSource(inputFile.toString());
        } catch(Exception e) {
             Log.e(TAG, "File Exception", e);
        }

        FrameLayout content = new FrameLayout(this);
        content.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT));

        mView = new TextureView(this);

        mView.setSurfaceTextureListener( new TextureViewListener( ) );
        mView.setOpaque(false);
        mView.setLayoutParams(new FrameLayout.LayoutParams(200, 200));
        mView.setBackgroundColor(Color.TRANSPARENT);

        content.addView(mView);         
        addContentView(content, content.getLayoutParams());
    }

    public class TextureViewListener implements TextureView.SurfaceTextureListener
    {
        public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
            Log.i(TAG,"onSurfaceTextureAvailable");
            mPlayer.setSurface(new Surface(surface));    
            mPlayer.prepareAsync();
            mPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                public void onPrepared(MediaPlayer mp) {
                    mp.start();
                }
            });
        }

        public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
        }

        public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
            return true;
        }

        public void onSurfaceTextureUpdated(SurfaceTexture surface) {
        }   
    }
} 

和C++侧:

#include <jni.h>
#include <errno.h>

#include <android/log.h>
#include <android_native_app_glue.h>
#include <android/native_window_jni.h>

void android_main( android_app* state )
{
    app_dummy();
    __android_log_print(ANDROID_LOG_INFO, "native-lib", "android_main");
}
编辑:

好的,在阅读logcat之后,似乎没有创建TextureView:

W/TextureView(  571): A TextureView or a subclass can only be used with hardware acceleration enabled.
完整舱单:

android:hardwareAccelerated="true"
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.sample.surfaceview" android:versionCode="1" android:versionName="1.0">
  <uses-sdk android:minSdkVersion="11" android:targetSdkVersion="19" />
  <uses-feature android:glEsVersion="0x00020000">
  </uses-feature>
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">
  </uses-permission>
  <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" android:hasCode="true" android:hardwareAccelerated="true" android:debuggable="true">
    <activity android:name="com.sample.surfaceview.SurfaceActivity" android:hardwareAccelerated="true" android:label="@string/app_name" android:configChanges="orientation|keyboardHidden">
      <!-- Tell NativeActivity the name of or .so -->
      <meta-data android:name="android.app.lib_name" android:value="native" />
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
  </application>
</manifest>

你能更具体地说一下我的应用程序坏了吗?它会引发异常吗?本机代码崩溃?显示空白屏幕?logcat中显示了什么?它显示一个黑屏,并且永远不会到达曲面创建回调。