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

 2023-01-19    342  

问题描述

我正在搜索应该将.doc/.docx转换为.pdf的库中.

我得到了pdftron android SDK,因为他们给了libpdfnetc.so file.

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

对于转换,有一个称为转换的类,内部有一个方法topdf(),
在这种方法中,他们内部称为本机方法filetopdf().我尝试了该代码,但无法调用该本机方法,并且正在获取错误

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

推荐答案

您必须链接使用ndk-build生成的最终共享库,并使用ndk-build与PDF共享库链接您所说的 您已经为ARM Architecture编辑 .
(确保是这种情况,否则库将无法在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

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

对于共享库,生成并部署到设备/模拟器的APK包含最终共享库以及您针对链接的所有预构建的共享库,而与链接的静态库相比没有捆绑在APK中.

对于您的用例,在设备上解开APK后,您的Android应用程序的LIB目录中应该有两个共享库.
您可以通过从终端运行以下命令来检查此问题:

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

用您的应用程序的软件包名称替换com.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...
}

请注意,系统内的使用相同名称.loadlibrary方法调用为最终共享库名称.

其他推荐答案

您需要确保系统上可用映射到本机接口的.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 file)在JNI下遵守以获取.so文件.

.mk文件使用C/C ++片段写在本机代码中.

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

1. 在工作旧ADT + SDK版本时:
您将需要在Windows配置上配置Linux环境,以便在Shell上运行JNI命令.可以通过网络上的各种软件(例如Cygwin设置)来实现此环境.

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

以上所述是小编给大家介绍的如何在Android应用程序中使用现有的.so文件,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/25903.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。