如何在android应用程序中使用现有的.so文件



我正在寻找一个库,应该在android平台将。doc/。docx转换为。pdf。

我得到了PdFTron android sdk,因为他们已经给了libPDFNetC。所以文件。

对于Conversion,有一个叫做Convert的类,里面有一个方法toPDF(),在该方法中,他们内部调用了本地方法FileToPdf()。我尝试了该代码,但无法调用本机方法,并得到错误

我想知道,如果有现有的。so文件存在与你,如果你想调用本机方法,这是存在于。so文件那么是否需要使用JNI?我对JNI了解不多。任何帮助。

你必须将Android NDK使用ndk-build生成的最终共享库链接到你所说的PDF共享库你已经为ARM架构编译的。(确保是这样的,否则库将无法在Android上工作!)

对于

,如果您有以下目录结构:

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

您需要在Android中包含以下内容。可文件:

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)

应用程序的内容。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中的静态库形成对比。

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

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...
}

注意,在系统中使用了与相同的名称。

您需要确保映射到本机接口的.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映射兼容!

要在ndk上工作,有一个。mk (make文件)在JNI下编译以获得。so文件。

。Mk文件是用本地代码使用c/c++代码段编写的。

现在要使用JNI进行编译,有两种常见的方法:

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

2。如果您使用的ADT + SDK版本已更新:然后在ADT中有一个NDK插件可用。因此,在ndk和本机库上工作更容易。有关NDK的更多信息,请访问此处

最新更新