Проблема с использованием TextureView с NDK -- java поле с участием android поле с участием c++ поле с участием android-ndk пол Связанный проблема

Issue using TextureView with NDK


1
vote

проблема

русский

Я работаю над небольшим кусочком кода, используя текстуру, чтобы отобразить результат среды MediaPlayer.

Я сталкиваюсь с проблемой, пытающимся смешивать управляемый код и нативный код, используя NDK. Если моя деятельность наследует от NativeActivity вместо активности, мое приложение сломано.

Это известное ограничение? Это связано с клеем 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"); }   

Наконец в манифесте:

 <код> android:hardwareAccelerated="true"   

Редактировать:

ОК, после прочтения логики, кажется, что текстура не создается:

 <код> W/TextureView(  571): A TextureView or a subclass can only be used with hardware acceleration enabled.   

Полное манифест:

 <код> <?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>   
Английский оригинал

I'm working on a small piece of code using a TextureView to display the result of a MediaPlayer.

I'm facing an issue trying to mix managed code and native code using NDK. If my Activity inherit from NativeActivity instead of Activity, my app is broken.

Is it a known limitation? Is it a related to the NDK glue?

Here is my Activity Code:

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) {         }        } }  

And C++ side:

#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"); } 

Finally in the manifest:

android:hardwareAccelerated="true" 

EDIT:

Ok, after reading the logcat, it seem that the TextureView is not created:

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

Complete manifest:

<?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> 
</div
           
   
   

Список ответов

Связанный проблема

0  Реализация ARP Smooth  ( Implementing arp sweep ) 
Я играю с libpcap / jpcap. Реализация Sweeper ARP. Я отправляю запрос на все IP в блоке до вещательного адреса и чтения ответов. Теперь я не могу думать о том...

0  Что такое ошибка Java: 93: достигается конца файла во время анализа?  ( What is java error 93 reached end of file while parsing ) 
Это может быть относительно простым вопросом, но почему моя программа получает эту ошибку: Express.java: 93: Ошибка: достигается до конца файла во время анали...

21  Не мог зарезервировать достаточно места для кучи объекта, чтобы начать JVM  ( Could not reserve enough space for object heap to start jvm ) 
Просто столкнулся со странной проблемой. Когда я набрал <код> java -version Я получил <код> Error occurred during initialization of VM Could not reser...

1  Устройство не получают сообщение от GCM  ( Device not receive message from gcm ) 
Я пытаюсь использовать GCM для отправки уведомления с сервера на наше устройство. Все следуют в этом руководстве: http://hmkcode.com/android-google-cloud-m...

0  Чтение записи студентов из файла  ( Reading student record from file ) 
Я пытаюсь прочитать файл, который имеет запись студентов (имя, фамилия и оценка). Я написал простой код для выполнения этой задачи, но код не удается после пр...

2  Наличие JSF выпивать поля поиска HTML. Doable?  ( Having jsf spit out an html search field doable ) 
Я не разработчик Java, но работаю с командой, которая использует JSF 1.2 Мы хотели бы начать использовать теги HTML 5 и атрибуты. Не отображается, что JSF 1...

-3  Я хочу знать, как извлечь данные из файла PDF с помощью Java [Закрыто]  ( I want to know how to extract data from a pdf file using java ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> закрыт . Этот вопрос должен быть больше Фокусированный . В настоя...

5  Веб-сервисы в Java  ( Web services in java ) 
Что вы обычно используете для подключения к веб-сервису, когда вы разрабатываете проект Java? Есть разные API-S, которые могут сделать работу. Из разных кни...

87  Регулярное выражение для URL-адресов в Java  ( Regular expression to match urls in java ) 
<Р> Я использую RegexBuddy при работе с регулярными выражениями. Из своей библиотеки я скопировал регулярное выражение для URL-адресов. Я успешно протестирован...

27  Отслеживание запроса XML / Ответы с JAX-WS при возникновении ошибки  ( Tracing xml request responses with jax ws when error occurs ) 
Я хочу войти в систему RAW Post Post, если есть какие-либо ошибки, я использую JAX-WS. Любая помощь будет оценена. Есть просто простым способом (ака: не исп...

0  Почему этот модульный тест говорит, что мой каталог не существует, когда он делает?  ( Why does this unit test say my directory doesnt exist when it does ) 
Этот код <код> URL listofFiles = this.getClass().getResource("someDir"); File f = new File(listofFiles.toString()); File[] files = f.listFiles(); работа...

1  Jaxb Marshalling само отношении  ( Jaxb marshalling self relation ) 
Рассмотрим известное отношение сотрудника / менеджера <код> public class Employee { public Employee manager; public List<Employee> employees; } То, чт...

154  Любой способ вызвать частный метод?  ( Any way to invoke a private method ) 
У меня есть класс, который использует XML и отражение для возврата <код> Object s на другой класс. Обычно эти объекты являются подпольными полями внешнего ...

0  LinkedList Рекурсивный метод  ( Linkedlist recursive method ) 
Я пытаюсь написать рекурсивный метод, который печатает связанный список в обратном порядке, но я получаю ошибку Stackoverflow. Метод должен завершиться, когда...

-1  Java создает массив объекта, который 40% длины массива должен быть объектом x другой объект 30% Z и 30% объекта Y [закрыто]  ( Java create an array of object which the 40 of the array length should be objec ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> закрыт . Этот вопрос нуждается в Детали или ясность . В настоящее...

Связанный проблема

0  Реализация ARP Smooth 
0  Что такое ошибка Java: 93: достигается конца файла во время анализа? 
21  Не мог зарезервировать достаточно места для кучи объекта, чтобы начать JVM 
1  Устройство не получают сообщение от GCM 
0  Чтение записи студентов из файла 
2  Наличие JSF выпивать поля поиска HTML. Doable? 
-3  Я хочу знать, как извлечь данные из файла PDF с помощью Java [Закрыто] 
5  Веб-сервисы в Java 
87  Регулярное выражение для URL-адресов в Java 
27  Отслеживание запроса XML / Ответы с JAX-WS при возникновении ошибки 
0  Почему этот модульный тест говорит, что мой каталог не существует, когда он делает? 
1  Jaxb Marshalling само отношении 
154  Любой способ вызвать частный метод? 
0  LinkedList Рекурсивный метод 
-1  Java создает массив объекта, который 40% длины массива должен быть объектом x другой объект 30% Z и 30% объекта Y [закрыто]