7

我正在寻找应该在 android 平台上将 .doc/.docx 转换为 .pdf 的库。

我得到了 PdFTron android sdk,因为他们提供了 libPDFNetC.so 文件。

对于转换,有一个名为 Convert 的类,其中有一个方法 toPDF(),在该方法中,他们在内部调用了本机方法 FileToPdf()。我尝试了该代码,但无法调用该本机方法并出现错误

我想知道是否存在现有的 .so 文件,并且如果您想调用 .so 文件中存在的本机方法,那么是否需要使用 JNI?我不太了解JNI。任何帮助。

4

3 回答 3

4

您必须将由 Android NDK 生成的最终共享库链接到您说您已经为 ARM 架构编译ndk-build的 PDF 共享库。(确保是这种情况,否则该库将无法在 Android 上运行!

为此,例如,如果您具有以下目录结构:

jni
└── libs
└────── my_shared_lib.so
└── Android.mk
└── Application.mk

您需要在Android.mk文件中包含以下内容:

LOCAL_PATH := $(call my-dir)

# define our prebuilt shared library as a module to the build system
include $(CLEAR_VARS)
LOCAL_MODULE := mysharedlib
LOCAL_SRC_FILES := libs/my_shared_lib.so
include $(PREBUILT_SHARED_LIBRARY)

# The final shared library that will be bundled inside the .apk
include $(CLEAR_VARS)
LOCAL_MODULE := mynativelib
LOCAL_LDLIBS := -landroid -llog
LOCAL_CPPFLAGS := -O0 -g3 -std=c++11 -Wall -Wextra 
LOCAL_SHARED_LIBRARIES := mysharedlib
LOCAL_C_INCLUDES := myheader1.h myheader2.h
LOCAL_SRC_FILES := src_file1.cpp src_file2.cpp
include $(BUILD_SHARED_LIBRARY)

以及Application.mk文件的内容(用于使用 C++ 标准库,并为两个不同版本的 ARM 架构构建最终的共享库):

APP_OPTIM := debug
APP_PLATFORM := android-14
APP_STL := gnustl_static
APP_ABI := armeabi armeabi-v7a

然后,在您从 Eclipse 中或使用ndk-build脚本从命令行编译代码后,它将编译您最终的共享库并将其链接到您的预构建共享库(即您说您正在尝试使用的 PDF 共享库) .

对于共享库,生成并部署到设备/模拟器的 apk 包含最终共享库以及您链接的所有预构建共享库,与链接到未捆绑在 apk 内的静态库相反。

对于您的用例,在设备上解压缩 apk 后,您的 Android 应用程序的 lib 目录中应该有两个共享库。您可以通过从终端运行以下命令来检查这一点:

adb shell ls -l /data/data/com.company.myapp/lib

将 com.company.myapp 替换为您的应用程序的包名称。

另外,不要忘记将以下内容放在 Java 类的静态上下文中:

class MyClass
{
      static
      {
            try
            {
                System.loadLibrary("mynativelib");
            }
            catch (UnsatisfiedLinkError ule)
            {
               Log.e(TAG, "WARNING: Could not load native library: " 
                      + ule.getMessage());
            }
      }

       // other code here...
}

请注意在System.loadLibrary 方法调用中使用与最终共享库名称相同的名称。

于 2013-01-29T08:41:53.980 回答
2

您需要确保映射到本机接口的 .so 文件在您的系统上可用,并且可以被 Java 找到。

在您的 Java 代码中应该有类似System.loadLibrary("<libraryname>")或某处的调用。System.load("/path/to/libs/lib<libraryname>.so")这将指示 JVM 搜索具有给定名称的库并加载它。

  • System.load("/path/to/libs/lib<libraryname>.so")只会查找指定为参数的文件,然后加载它。
  • System.loadLibrary("<libraryname.")将在配置的库路径中查找名为 的库lib<libraryname>.so。库路径取自系统变量java.library.path

还要确保您正在加载的库版本与 Java JNI 映射兼容!

于 2013-01-18T10:40:07.543 回答
0

要在 ndk 上工作,有一个在 JNI 下编译的 .mk(make 文件)来获取 .so 文件。

.mk 文件是使用 c /c++ 片段以本机代码编写的。

现在使用 JNI 编译,有两种常见的方式:

1.在使用旧的 ADT + SDK 版本时: 您需要在 windows 配置上配置一个 linux 环境,以便在 shell 上运行 JNI 命令。这个环境可以通过网上的各种软件来实现,比如cygwin setup。

2.如果您使用的ADT+SDK版本更新: 那么ADT本身就有NDK插件可用。因此更容易在 ndk 和原生库上工作。 有关 NDK 的更多详细信息,请访问此处

于 2013-01-18T10:43:01.703 回答