初学者帮助NDK,java.lang.UnsatisfiedLinkError

时间:2011-04-11 20:12:21

标签: android android-ndk

我正在尝试创建我的第一个使用NDK的Android应用。我正在尝试使用live555.com来源构建一个应用程序,将MP4文件从手机流式传输到其他地方。

我使用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下的适当位置构建的 的System.loadLibrary( “testProgs”);在我尝试本机调用之前调用 运行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应用程序运行时,感谢任何帮助。

谢谢, 詹姆斯

3 个答案:

答案 0 :(得分:1)

您是否在Android.mk文件的LOCAL_SRC_FILES变量中包含了testOnDemandRTSPServer.cpp?

当你执行ndk-build时,你应该看到你编译的LOCAL_SRC_FILES中包含的每个c / c ++文件。您应该看到一条线(如果有多个c / c ++文件,则包括其他几个):

编译arm:libtestProgs< = testOnDemandRTSPServer.cpp

实际上,根据您执行ndk-build时包含的输出,看起来您没有在LOCAL_SRC_FILES中包含任何内容,而您只是创建了一个没有编译到其中的libtestProgs.so文件。 / p>

来自文档:

“LOCAL_SRC_FILES变量必须包含C和/或C ++源列表 将构建并组装到模块中的文件。请注意,你应该 这里没有列出标题和包含的文件,因为构建系统会 自动为您计算依赖关系;只列出源文件 这将直接传递给编译器,你应该很好。“

请参阅您下载的Android JNI的docs文件夹中的ANDROID-MK.html以获取详细信息。

答案 1 :(得分:0)

编辑testOnDemandRTSPServer.cpp后,你做过:

  1. 重新执行ndk-build?

  2. 确保使用更新的libtestProgs.so重建Android项目?如果您正在使用Eclipse,则可以右键单击libs文件夹并单击Refresh。

  3. 您还可以将这些步骤自动化:http://mobilepearls.com/labs/ndk-builder-in-eclipse/(不是我的网站)

    当我碰到这个时,通常是因为我忘了做其中的一个。

答案 2 :(得分:0)

您是否尝试过本次讨论中提到的步骤?

http://forum.videolan.org/viewtopic.php?f=13&t=89166