Я пытаюсь создать свое первое приложение для Android, которое использует NDK. Я пытаюсь использовать источники live555.com для создания приложения, которое транслирует MP4-файл с телефона в другое место.
Я использую 32-разрядную версию Windows 7 с JDK 1.6.0_24, MOTODev 2.1 и последними Android SDK и NDK.
Пока что я настроил новый проект и создал каталог jni. Внутри JNI я разместил исходные файлы и файлы Android.mk. Если я выполняю ndk-build, я вижу:
$ $NDK/ndk-build
SharedLibrary : libtestProgs.so
Install : libtestProgs.so => libs/armeabi/libtestProgs.so
Похоже, создается нативная библиотека.
Когда я запускаю свое приложение, оно падает с lava.lang.UnsatisfiedLinkError: startStream.
startStream () - это метод, который я пытаюсь вызвать в библиотеке libtestProgs.so.
Вещи, которые я проверил:
libtestProgs.so построен и в правильном месте под libs / armeabi
System.loadLibrary ( "testProgs"); вызывается перед попыткой родного вызова
Запустите javah -o jni.h com.streamtest.MainActivity и включите этот .h из файла .cpp.
Вот мой файл MainActivity.java:
package com.streamtest;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends Activity {
public static final String LOG_TAG = "StreamTest";
static
{
try
{
//System.loadLibrary("jnix");
System.loadLibrary("testProgs");
}
catch(Throwable e)
{
Log.e(LOG_TAG, e.toString());
throw new RuntimeException(e);
}
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// call our native code
Log.e(LOG_TAG, "About to call native code!");
startStream();
}
private native void startStream();
}
Собственный файл c ++ - это просто файл testOnDemandRTSPServer.cpp с live555.com. Я изменил метод main () на собственный метод Java. Вот оно:
#include "com_streamtest_MainActivity.h"
#include "liveMedia.hh"
#include "BasicUsageEnvironment.hh"
void Java_com_streamtest_MainActivity_startStream(JNIEnv *env)
{
// Begin by setting up our usage environment:
TaskScheduler* scheduler = BasicTaskScheduler::createNew();
uenv = BasicUsageEnvironment::createNew(*scheduler);
Вот вывод LogCat:
04-12 08:40:27.934: ERROR/StreamTest(17130): About to call native code!
04-12 08:40:27.965: ERROR/AndroidRuntime(17130): FATAL EXCEPTION: main
04-12 08:40:27.965: ERROR/AndroidRuntime(17130): java.lang.UnsatisfiedLinkError: startStream
04-12 08:40:27.965: ERROR/AndroidRuntime(17130): at com.streamtest.MainActivity.startStream(Native Method)
04-12 08:40:27.965: ERROR/AndroidRuntime(17130): at com.streamtest.MainActivity.onCreate(MainActivity.java:31)
04-12 08:40:27.965: ERROR/AndroidRuntime(17130): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
04-12 08:40:27.965: ERROR/AndroidRuntime(17130): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
04-12 08:40:27.965: ERROR/AndroidRuntime(17130): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
04-12 08:40:27.965: ERROR/AndroidRuntime(17130): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
04-12 08:40:27.965: ERROR/AndroidRuntime(17130): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
04-12 08:40:27.965: ERROR/AndroidRuntime(17130): at android.os.Handler.dispatchMessage(Handler.java:99)
04-12 08:40:27.965: ERROR/AndroidRuntime(17130): at android.os.Looper.loop(Looper.java:123)
04-12 08:40:27.965: ERROR/AndroidRuntime(17130): at android.app.ActivityThread.main(ActivityThread.java:4627)
04-12 08:40:27.965: ERROR/AndroidRuntime(17130): at java.lang.reflect.Method.invokeNative(Native Method)
04-12 08:40:27.965: ERROR/AndroidRuntime(17130): at java.lang.reflect.Method.invoke(Method.java:521)
04-12 08:40:27.965: ERROR/AndroidRuntime(17130): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
04-12 08:40:27.965: ERROR/AndroidRuntime(17130): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
04-12 08:40:27.965: ERROR/AndroidRuntime(17130): at dalvik.system.NativeStart.main(Native Method)
Меня интересует ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: главная линия. В исходном файле .cpp их метод main (). В моем новом файле нет main (). Это причина проблемы? Если это так, как я могу использовать файл .cpp в качестве библиотеки? Нужен ли метод main ()?
Любая помощь приветствуется, когда я пытаюсь запустить свое первое приложение NDK.
Спасибо,
Джеймс