我想创建我的第一个使用NDK的Android应用程序。我正尝试使用live555.com资源来构建一个应用程序,将MP4文件从手机传输到其他地方。NDK初学者的帮助,java.lang.UnsatisfiedLinkError
我使用Windows 7 32位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下的适当位置构建的。在我尝试本地调用之前调用 运行javah -o jni.h com.streamtest.MainActivity并从.cpp文件包含此.h。
这里是我的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++文件只是从live555.com的testOnDemandRTSPServer.cpp文件。我将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应用程序运行。
谢谢, 詹姆斯
就是这样。我浏览了每个Android.mk文件,以确保每个变量都扩展到正确的东西。其中一个包含错误。谢谢! – James 2011-04-13 18:46:07