2011-04-11 92 views
1

我想创建我的第一个使用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应用程序运行。

谢谢, 詹姆斯

回答

1

一个你有没有在您的Android.mk文件的LOCAL_SRC_FILES变量中包含testOnDemandRTSPServer.cpp?

当你执行ndk-build时,你应该已经看到了你编译的LOCAL_SRC_FILES中包含的每个c/C++文件。你应该看到这样一行(其中几个人,如果有多个C/C++文件):

编译手臂:libtestProgs < = testOnDemandRTSPServer.cpp

事实上,根据您从执行包括输出的ndk-build,看起来你没有在LOCAL_SRC_FILES中包含任何东西,并且你只是创建了一个libtestProgs.so文件,其中没有编译任何东西。

从文档:

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

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

+1

就是这样。我浏览了每个Android.mk文件,以确保每个变量都扩展到正确的东西。其中一个包含错误。谢谢! – James 2011-04-13 18:46:07

0

后您编辑testOnDemandRTSPServer.cpp,做你:

  1. 重新执行NDK,建立?

  2. 确保Android项目得到了更新libtestProgs.so重建?如果您使用的是Eclipse,则可以右键单击libs文件夹并点击刷新。

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

当我遇到这种情况,通常是因为我忘了做的那些2.

+0

试过两个,但仍然是相同的错误。我很确定我已经完成了ndk-build步骤,但不确定如何在Eclipse中强制刷新。无论哪种方式仍然无法工作。 – James 2011-04-12 12:35:31