【问题标题】:Eclipse does not create shared library file in the mixed project (NDK and Java)Eclipse 不会在混合项目(NDK 和 Java)中创建共享库文件
【发布时间】:2012-01-04 17:20:30
【问题描述】:

我在 Eclipse 中有一个项目,它使用 CDT 和 ADT 混合原生代码和 Java 代码。真的很简单——演示项目,就像在android-ndk-r7/samples/hello-jni中一样

我的 Android.mk(在 /jni 文件夹中)是:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_LDLIBS    := -llog

LOCAL_MODULE    := hlsdrm
LOCAL_SRC_FILES := hlsdrm.cpp

include $(BUILD_SHARED_LIBRARY)

一切编译正常,我可以通过

加载 hlsdrm 库
System.loadLibrary("hlsdrm"); 

并调用本机函数。但是库文件放在哪里呢?任何项目文件夹中都没有 libhlsdrm.so 共享库。正如我所读到的,它应该创建一个文件夹“libs”并将生成的库放入其中。

另外,当我尝试通过调用列出应用程序进程使用的库时:

PackageManager pm = getPackageManager();
String applicationPackage = this.getApplicationInfo().packageName;
ApplicationInfo ai = pm.getApplicationInfo(applicationPackage, PackageManager.GET_SHARED_LIBRARY_FILES);
String[] soFiles = ai.sharedLibraryFiles;

那么 soFiles 变量为空... 我试图通过清单的应用程序部分中的uses-library 值指定库,但之后Android OS 拒绝安装该应用程序并显示INSTALL_FAILED_MISSING_SHARED_LIBRARY 错误。

谁能解释我如何获得我的共享库 - 物理 .so 文件?

为什么sharedLibraryFiles 是空的,即使加载了库并且可以调用本机方法?

如何安装需要自定义共享库的应用程序?

【问题讨论】:

    标签: android android-ndk


    【解决方案1】:

    首先,您应该创建 libs 文件夹并设置您的项目。

    请参考以下文章:

    http://maxters.net/2011/02/android-ndk-builder-for-eclipse-in-windows/

    【讨论】:

    • 这篇文章很棒!不幸的是,它对我不起作用。我完全按照所有步骤进行,项目编译没有错误,但 libs 文件夹为空,应用程序在启动后立即崩溃:( 嗯,我花了几个小时编写本机代码,现在我花了第三天正在尝试设置 Eclipse 项目...
    • 应用程序崩溃是因为 System.loadLibrary("hello-jni");抛出异常...我尝试设置 PATH C:\cygwin\bin 来替换本机环境而不是追加,现在它在 libs 文件夹中创建 gdb.setup 和 gdbserver 文件,但库本身仍未构建。
    • 请发布更多信息,例如控制台消息和 logcat 消息。否则,我理解您的沮丧,但无济于事。我怀疑您的 NDK 或 eclipse 设置不正确,但这只是猜测。
    • 我终于成功了!我通过在 cygwin 控制台中键入 make -v 发现 cygwin make 不在路径上...所以我在系统中手动将 PATH 变量设置为 c:\cygwin\bin 现在它的工作方式与文章中描述的完全一样。但是我还不清楚一件事 - 为什么我不能列出 PackageManager 加载的共享库? 无论如何,感谢您的帮助!
    • 很高兴听到您解决了问题。至于 PackageManager 的问题,我没有太多经验,觉得你最好单独问一个问题。
    【解决方案2】:

    关于库:应该安装在/data/data/com.company.yourApp/lib/libhlsdrm.so

    顺便说一句:soFiles 不应该包含本机库(.so 文件),而是 .jar 文件。例如,如果您在清单中指定 <uses-library android:name="com.google.android.maps" /> 您的 soFiles 变量将包含 /system/framework/com.google.android.maps.jar

    【讨论】:

      猜你喜欢
      • 2011-05-25
      • 1970-01-01
      • 2013-08-31
      • 1970-01-01
      • 1970-01-01
      • 2012-03-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-23
      相关资源
      最近更新 更多