Java 使用带NDK的TextureView发布
我正在编写一小段代码,使用TextureView显示MediaPlayer的结果 我在尝试使用NDK混合托管代码和本机代码时遇到了一个问题。 如果我的活动继承自NativeActivity而不是Activity,则我的应用程序已损坏 这是已知的限制吗?它与NDK胶水有关吗 这是我的活动代码: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
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中显示了什么?它显示一个黑屏,并且永远不会到达曲面创建回调。