【问题标题】:android JNI loading mupdf (compile with NDK?)android JNI加载mupdf(用NDK编译?)
【发布时间】:2011-03-10 00:52:53
【问题描述】:

我正在创建一个 Android Xoom 应用程序,该应用程序在其中一个活动中显示 pdf。

我已经下载了 mupdf 源文件:mupdf.c、Android.mk、Application.mk、Core.mk 和 ThirdParty.mk。

我也去过mupdf.com网站,尝试从这里下载各种预编译包:http://ccxvii.net/mupdf/download/

我刚从 iPhone 切换到 Android,还有一些东西需要学习,包括 C 代码。我将 mk / c 文件放入我的项目中的 /jni/ 中。我还尝试将我从上面的网站下载的预编译文件复制到我的项目中的 /jni/ 中。

我有一个简单的课程:

import android.graphics.*;

    public class PDFView {  
        static {
            System.loadLibrary("mupdf");
        }
    }

每次我创建此类的实例时,应用程序都会崩溃,并在 LogCat 中显示“ExceptionInInitializerError”以及“无法加载 mupdf:findLibrary 返回 null”。

我也下载了android NDK并尝试自己编译源代码。我收到一个缺少的 mupdf.h 错误和 fitz.h 错误。只是一个完整的错误列表,包含一个库似乎过于复杂。

我正在使用 Snow Leopard 开发 Mac。我认为我走在正确的道路上,需要将其编译为二进制文件,但花了这么多时间学习 NDK 却无法编译,真是令人沮丧。也许我需要一个更新的来源。

谁能帮我指出正确的方向?

【问题讨论】:

  • 我正在阅读 android 的编译说明,它说要编辑 local.properties,我从 mupdf.com 下载的源代码中没有看到这样的文件。
  • 让我们从您的 ndk-build 错误开始。你能说明当你 ndk-build 时会发生什么吗?
  • 这比“加载库”更重要,因为库必须针对 ARM 和 Android 库构建。尝试加载库将返回 null,直到您获得此工作的 ndk 部分。
  • 马修,看看我下面的帖子

标签: android java-native-interface android-ndk


【解决方案1】:

您需要在 Android.mk 中正确设置包含路径

请发布您的 Android.mk 以获得更多帮助,但同时您可以尝试从 NDK samples 借用,它们包含在您的 NDK 文件夹中。

首先尝试将它们构建为健全性检查,然后查看 jni/Android.mk 以查看它们的 makefile 是如何设置的。

NDK 中的 docs 目录还包含有关 Android.mk 文件的精彩文档。

老实说,除非您有 C 方面的经验,否则很难使用 NDK。了解 make、gcc 和 ld 的来龙去脉至关重要。

编辑 - 为了使这个过程更容易,我会克隆 mupdf git 存储库。实际上有一个 Android project 可以构建。

确保您使用git 进行克隆,因为您希望拥有所有必要的文件。自述文件有关于构建的简单说明。似乎首先让这个工作并从中调整它可能会为您提供更可靠的开发路径。

【讨论】:

  • LOCAL_PATH := $(call my-dir) TOP_LOCAL_PATH := $(LOCAL_PATH) MUPDF_ROOT := .. 包括 $(TOP_LOCAL_PATH)/Core.mk 包括 $(TOP_LOCAL_PATH)/ThirdParty.mk 包括 $ (CLEAR_VARS) LOCAL_C_INCLUDES := \ $(MUPDF_ROOT)/draw \ $(MUPDF_ROOT)/fitz \ $(MUPDF_ROOT)/mupdf LOCAL_CFLAGS := LOCAL_MODULE := mupdf LOCAL_SRC_FILES := mupdf.c LOCAL_STATIC_LIBRARIES := mupdfcore mupdfthirdparty LOCAL_LDLIBS := -lm -llog -ljnigraphics 包括 $(BUILD_SHARED_LIBRARY)
  • 所以我已经走得很远了。我通读了 Thirdparty.mk 并注意到他们指定的目录不包括我下载的文件夹的版本号。因此,我重命名了该文件夹,并且能够达到现在显示“没有创建目标的规则”的地步。我试图弄清楚这一点,Core.mk 的最后一行是 $(BUILD_STATIC_LIBRARY)。必须有另一个路径,某个地方需要为 make 文件或其他东西更新。
  • 上帝......现在我得到了像“pdf_crypt.c:364: undefined reference to `fz_sha256init'”这样的东西。我刚刚完成了类型重新定义的源代码编辑。为什么这个分布有这样的错误?他们不会运行测试构建吗?或者只有“有价值的”开发人员可以花 3 个小时调试它,才允许使用此代码。
  • Android项目链接失效
【解决方案2】:

我已经能够为 android 构建 mupdf 库。 我同意 Paul 的观点,我必须做一些修改才能让它发挥作用。您应该能够通过较小的更改来修复这些错误。您应该关注的是确保所有这些不同的第三方源文件夹的路径都存在且正确。

【讨论】:

    猜你喜欢
    • 2014-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多