Native method error android

java.lang.IllegalStateException at android.media.MediaRecorder.start(Native Method)

I want to make a voice recorder app but it crashes when i click the «Start Recording» button. I get an error saying java.lang.IllegalStateException at android.media.MediaRecorder.start(Native Method). Ive also attached the log.

5 Answers 5

you are forgetting to call recorder.prepare() before recordeer.start() function in your beginRecording function.

Prepare function will take care about lot of things like conversion of analog data to digital audio for compresion and where to store the file etc

You have to take into consideration, that MediaRecorder as well as MediaPlayer has their state machines, which obligate you to do some action in specific sequence.

Here you tried to start recording withou preparing MediaRecorder . Call

Because we are not releasing recorder and only stopping the recorder on relaunch we get at android.media.MediaRecorder.start(Native Method) took 1 hrs to figure out

HappyCoding

Call this after setOutFormat() but before prepare().


this is just what my android studio docs dialog says while i write this method name. the point is that you should call this method just before prepare().
here is an example:

Источник

Android Studio — Native method not found — Include .so file in build

I’m starting with NDK, and want to compile my first hello-world app with it.

My application is just a simple application with an Activity, and my MainActivity is in com.example.myapplication2.app

I would like to use a native method in it, and here is what I did :

in my jni folder :

And here, my gradle :

When I want to run my project, I have no C error (I had before, that’s why I’m sure compilation is done, and OK).

But, when I want to run the application, I have the error :

java.lang.UnsatisfiedLinkError: Native method not found: com.example.myapplication2.app.MainActivity.stringFromJNI:()Ljava/lang/String;

  • com.example.myapplication2.app.MainActivity.stringFromJNI and Java_com_example_myapplication2_app_MainActivity_stringFromJNI are matching
  • extern «C» is not present, because when I used it, I encountered this error : Error: «expected ‘(‘ before string constant»

May you know why I encounter this error ?

2 Answers 2

Add a System.loadLibrary(«hello-jni») call to your app startup. Static constructor would be a good place.

The error was in gradle file, which was not doing everything.

Here is my final .gradle file.

Before compilation, it adds three tasks before compilation to do the following :

  1. Run the NDK build
  2. Copy the *.so files from /src/main/libs to /build/lib
  3. Compress the /build/lib folder into /libs/lib.jar

Requirements :

  1. Your bin folder of JDK must be in the PATH environment variable
  2. You must have an ANDROID_NDK environment variable with the path to your NDK (the one downloaded on Android website)

Then, it will include all the needed .so files into your application, without any ndk command needed in your gradle.

Читайте также:  Android tbi для n900

Advantage of it : One APK for all platforms Inconvenient of it : APK bigger, because it contains .so files for all platforms.

Источник

Отладка приложений для Android без исходных кодов: native методы

О чем эта статья

В двух предыдущих статьях я рассказывал как отлаживать приложения для Android без исходного кода на Java и о некоторых особенностях установки breakpoints. Если уважаемый читатель ещё не ознакомился с этими статьями — я настоятельно рекомендую начать с них, а уже потом читать эту статью.

Так уж вышло что до сих пор я рассказывал исключительно об отладке байткода Dalvik и ни словом не обмолвился об отладке native методов. А ведь именно в native методах часто скрывается самое вкусное — хитрые защиты, интересные malware фичи, уязвимости нулевого дня. Поэтому сегодня я сжато, без «воды», расскажу как отлаживать native методы без исходного кода на C/C++ (ну или на чем, уважаемый читатель, они у вас там написаны).

Что бы извлечь пользу из моего рассказа нужно быть уже немного «в теме». В частности желательно что бы читатель

  • понимал синтаксис Smali, мог вписывать в .smali файлы свой код и мог отличить декларации и вызовы native методов от обычных методов, умел пересобирать .apk файлы используя Apktool;
  • представлял себе что такое Java Native Interface (JNI) и как это работает;
  • знал для чего используются методы System.load(. ) и System.loadLibrary(. ), как они работают в Android, и по аргументам этим методов в Smali коде мог самостоятельно определить в каких .so библиотеках находятся JNI функции соответствующие тем или иным native методам;
  • умел найти эти JNI функции в .so библиотеках;
  • хотя бы на начальном уровне знал ассемблер ARM (в статье предполагается что отладка будет выполняться на устройстве с архитектурой ARM либо на эмуляторе который эту архитектуру эмулирует);
  • имел какой-то опыт работы с gdb и gdbserver;

Вот пожалуй и все знания и навыки которые будут нужны читателю. Перейдём к инструментам.

Инструменты

Сегодня нам понадобится:

  • gdb и gdbserver для ARM из последней версии Android NDK. Установка описана тут.
  • Утилита adb из последней версии Android SDK. Установка описана здесь.
  • Если отладка идёт на реальном Android-устройстве — на нём нужны права root.

Перейдём к подготовке.

Подготовка

Предполагается что читатель достаточно опытен что бы самостоятельно выполнить следующие подготовительные действия:

  • Дизассемблировать .apk файл приложения с помощью Apktool, исследовать файлы в поддиректории папка/куда/дизассемблировали/приложение/smali и выяснить:
    • какие native методы вызываются из байткода Dalvik;
    • в какой .so библиотеке находятся соответствующие этим методам JNI функции;

  • Вытащить эту .so библиотеку из поддиректории папка/куда/дизассемблировали/приложение/lib либо с устройства на котором будет производиться отладка, исследовать её и узнать как называются JNI функции которые соответствуют тем или иным native методам вызываемым из байткода Dalvik.
  • Пересобрать .apk приложение с помощью Apktool с оцпией -d и загнать под отладку в NetBeans как написано в этой моей статье.
  • Сделать так, что бы отладка в NetBeans остановилась после вызовов System.loadLibrary(. ) или System.load(. ) , которые загружают .so с интересующими нас JNI функциями, но до первого вызова какого-либо из native методов. Можно использовать трюк о котором я писал тут.
  • Запихнуть gdbserver на устройство или эмулятор на котором отлаживаем.

Теперь, когда все приготовления закончены, можно переходить собственно к отладке.

Отладка

Идея в том, что бы загнать наше приложение сразу под два отладчика: под отладчик встроенный в NetBeans — что бы отлаживать байткод Dalvik, и под gdb — исключительно что бы отлаживать вызовы native методов. Звучит слегка странно, но на практике вполне себе работает. Хотя и не всегда — см. следующий раздел «Подводные камни».

Итак, если читатель выполнил все подготовительные действия из предыдущего раздела «Подготовка», то сейчас у него на устройстве или эмуляторе наверняка запущено пересобранное приложение, на компьютере открыт NetBeans и отладка стоит где-нибудь после вызова System.load(. ) или System.loadLibrary(. ) , но ещё до первого вызова native метода. Причем читатель уже в курсе в какой библиотеке какие JNI функции каким native методам соответствуют. С этого мы и начнём.

Дальше идёт пошаговая инструкция. Она писалась для Windows, но думаю будет работать и для Linux и MacOS. Пожалуйста, следуйте инструкции в точности:

  1. Командной abd shell откройте ADB консоль вашего устройства или эмулятора. Найдите PID процесса вашего приложения воспользовавшись командой ps в ADB консоли. В этой же консоли выполните команду:
    где %PID% и есть PID процесса вашего приложения. В ответ gdbserver должен вывести что-то вроде:
    Начиная с этого момента отладка в NetBeans «замёрзнет». Т.е. вы конечно сможете там кликать на кнопки, но это бесполезно т.к. приложение которое вы пытаетесь отлаживать в NetBeans в данный момент остановлено под отладчиком GDB. Не паникуйте, всё так и должно быть!
  2. Откройте новую консоль на вашем компьютере, выполните команду
  3. В этой же консоли запустите gdb из Android NDK:
    где libMyNativeLibrary.so — та самая .so библиотека в которой находятся интересующие нас JNI функции. Библиотека должна лежать на вашем компьютере в каталоге который для gdb является текущим при старте. В результате откроется консоль gdb.
  4. В консоли gdb наберите следующие команды:
    После этих манипуляций в консоли gdb должно появится сообщение наподобии
    а в консоли ADB (она у нас ещё открыта, помните?) что-то типа
  5. В консоли gdb выполните
    что бы увидеть список функций. В списке среди прочих функций должны быть и интересующие вас JNI функции, что-то типа:
  6. В консоли gdb поставте breakpoints на адреса интересующих вас JNI функций, в нашем случае это
  7. Возобновите выполнение вашего приложения с помощью команды c в gdb консоли. После выполнения этой команды, отладка в NetBeans «размёрзнется» и вы снова сможете отлаживать байткод Dalvik.

Теперь, каждый раз когда в байткоде Dalvik будет встречаться вызов native метода вроде
отладка в NetBeans будет «замерзать», зато gdb будет вас радовать сообщениями вроде

Вот это собственно оно и есть. Дальше x/i $pc , stepi — в общем вперёд отлаживать одну ARM-инструкцию за другой (помните я говорил в начале что ARM ассемблер будет нужен? — ну вот. )

Подводные камни

О, их тут много. Целый сад подводных камней. Вот наиболее запоминающиеся глюки, которые попались мне при использовании GNU gdb (GDB) 7.4.1 в связке с GNU gdbserver (GDB) 7.4.1 на Android 4.0.3 в устройстве Ainol Aurora (той, старой ещё):

Источник

android native method not found

i get No implementation found for native Lcom/vb/HAR/VBHARActivity;.nativeMain:()V error on windows 7. i have compiled and run sanangeles and hello-jni samples with no problem on emulator and device. here are the specs window 7, ndk-9rb, adt 22(comes with eclipse), java 1.7, mingw, no cygwin, ndk-build and android project build gives no errors. the android project has minimum sdk of 10 and target 19. libvbhar.so is 29k in the libs directory but much larger in obj directory. verified that the shared lib is copied to emulator.

the paths for the project are src\com\vb\HAR\VBHARActivity.java

c code

android.mk

thank you for your help alex

1 Answer 1

It’s looking for Java_com_vb_HAR_VBHARActivity_nativeMain , but you’re providing Java_com_vb_vbHarC_VBHARActivity_nativeMain . Rename your method to match.

You should also make sure that it’s declared with extern «C» .

Not the answer you’re looking for? Browse other questions tagged android android-ndk or ask your own question.

Hot Network Questions

Subscribe to RSS

To subscribe to this RSS feed, copy and paste this URL into your RSS reader.

site design / logo © 2021 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2021.12.3.40888

By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.

Источник

[Android] Error on setup: «Method addObserver must be called on the main thread» #255

Comments

cristeahub commented Jan 24, 2021 •

After upgrading one of my other dependencies in my android app (namely Stripe Android SDK from 10.x to 16.x) I surprisingly encountered an error in this SDK. Note that one of the changes from this huge jump is that the StripeSDK has migrated to AndroidX.

When i do analytics.setup(MY_WRITE_KEY, I get a redbox in my app with the text writeKey must not be null or empty .

I have debugged and verified that the writeKey is indeed set correctly, so this is just a symptom and not the actual issue.

Digging further down I found that when initializing the Segment Android SDK I got the following error Method addObserver must be called on the main thread . This seems to be the actual issue causing my subsequent calls to analytics to fail due to the writeKey not being set.

The error is caught here:

Lines 187 to 191 in 226a9e4

> catch (e2 : IllegalStateException ) <
// pass if the error is due to calling setSingletonInstance multiple times
// if you created singleton in native code already,
// you need to promise.resolve for RN to properly operate

This error comes from the analytics-android package that this package depends on. The error seems to stem from AndroidX issues, and there’s even an issue on that repo for the error: segmentio/analytics-android#725 .

This is a blocker for us now, I am asking here since we are using react native and there was no answer from the developers at the other repo. Is there a way to escalate this issue so it gets attention and gets fixed?

I found a related issue from a different vendor here: getsentry/sentry-android#520 . This issue was about lifetime handlers, which both the original issue creator on the segment-android repo and myself use. However simply turning that off was not enough to fix the issue.

Alternatively do you know of any workarounds?

Thanks for a great library otherwise!

The text was updated successfully, but these errors were encountered:

Источник

Читайте также:  1 ipv6 localhost android
Оцените статью