7

Androidプラットフォームで.doc/.docxを.pdfに変換するライブラリを探していました。

libPDFNetC.soファイルが提供されているという点で、PdFTron android sdkを入手しました。

変換には、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 アーキテクチャの 2 つの異なるバージョン用の最終的な共有ライブラリをビルドするため):

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 ディレクトリに 2 つの共有ライブラリが必要です。これは、ターミナルから次のコマンドを実行して確認できます。

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

また、ロードするライブラリバージョンがJavaJNIマッピングと互換性があることを確認してください。

于 2013-01-18T10:40:07.543 に答える
0

ndk で作業するには、.so ファイルを取得するために JNI でコンパイルされる .mk (make ファイル) があります。

.mk ファイルは、c /c++ スニペットを使用してネイティブ コードで記述されます。

JNI を使用してコンパイルするには、次の 2 つの一般的な方法があります。

1.古いバージョンの ADT + SDK を使用している場合: シェルで JNI コマンドを実行するには、Windows 構成で Linux 環境を構成する必要があります。この環境は、cygwin のセットアップなど、ネット上で入手できるさまざまなソフトウェアを介して実現できます。

2.使用している ADT + SDK のバージョンが更新されている場合: ADT 自体で利用可能な NDK プラグインがあります。そのため、ndk とネイティブ ライブラリで作業する方が簡単です。 NDK の詳細については、こちらをご覧ください

于 2013-01-18T10:43:01.703 に答える