2017-10-24 7 views
3

オンラインで特定の質問に答えられた人が見つかりませんでした。私はいくつかの.soライブラリをコピーして新しいプロジェクトに貼り付ける古いAndroidプロジェクトを持っています。私はこのようなことを初めて知っています。私はこれらのライブラリをどこに見つけるべきか私の新しいプログラムに伝える必要があることを知っていますが、私はCMakeまたはNDKを使ってコンパイルされたコードをインポートする必要があるかどうかわかりません。これは私のディレクトリは次のようになります。他のアンドロイドスタジオプロジェクトに既存のjniライブラリを追加しました。

enter image description here

私はこのような私のプログラムでは、このライブラリを呼ぶ:

static { 
     System.loadLibrary("serial_port"); 
    } 

しかし、どのように私はどここれらのコピーと貼り付けたファイルを検索するようにコンパイラを教えてください?

Androidからdocumentationに基づいてファイルを開始しましたが、いくつか混乱しています。これはこれまで私が持っているものです:

# Sets the minimum version of CMake required to build your native library. 
# This ensures that a certain set of CMake features is available to 
# your build. 

cmake_minimum_required(VERSION 3.4.1) 

# Specifies a library name, specifies whether the library is STATIC or 
# SHARED, and provides relative paths to the source code. You can 
# define multiple libraries by adding multiple add.library() commands, 
# and CMake builds them for you. When you build your app, Gradle 
# automatically packages shared libraries with your APK. 

add_library(# Specifies the name of the library. 
      serial_port 

      # Sets the library as a shared library. 
      SHARED 

      IMPORTED 

      serial_port/src/${ANDROID_ABI}/libserial_port.so 

      # Provides a relative path to your source file(s). 
      src/main/cpp/libs/armeabi/libserial_port.so) 

私はそれを正しくやっているとは思いません。見て、正しい方向に私を指摘してください。ありがとう

答えて

1

あなたはそれぞれのフォルダにjniLibsのディレクトリ内にそれらを保管する必要があります。

例えば、

/app/src/main/jniLibs/armeabi/libserial_port.so

そして、あなたはそれらを使用するCMakeのような任意の他のツールを使用する必要はありません。それらを直接ロードすることができます。

+0

私のサブディレクトリ(x86、armeabi)でも動作しますか?私は前にこれを試しましたが、アンドロイドスタジオは私が私のライブラリをロードしたときに呼んでいたオープンメソッドを認識できませんでした。 System.loadLibrary( "serial_port")を呼び出すと、このライブラリを認識していないようです。 PS私はこのライブラリを書いていませんでした。私は製造業者が私に送ったサンプルプログラムからそれを取っています。シリアルポートにアクセスして、POSシステムの内部プリンタにアクセスしようとしています。サンプルプログラムでは、privateスタティックネイティブFileDescriptor open(String path、int baudrate、int flags、boolean flowCon)を呼び出します。 –

+0

Androidスタジオは認識しません。しかし、そのファイルをそれぞれのディレクトリに置くと実行されます。 –

+0

ところで、静的なネイティブメソッドを好きな場所に置くことはできません。私はあなたが適切なクラスで適切なパッケージでそれらを宣言していることを願っています。サンプルプログラム内に正確に配置します。 –

0

AndroidスタジオのデフォルトJNI forlderは、jniLibsです。ネイティブライブラリをこのフォルダの中に置くと、自動的にappビルドパスに追加されます。

あなたの場合、のlibsフォルダにネイティブコードを入れました。それを動作させるには、新しいJNIパスをapp/build.gradleファイルに指定する必要があります。 ---

android{ 

    sourceSets { 
     main { 
      jniLibs.srcDirs = ['libs'] 
     } 
    }  

} 
+0

ファイルの読み込みはどうですか?私はこのようにロードします:System.loadLibrary( "serial_port"); Androidは「serial_port」と呼んでいるとき、Androidの意味をどのように知っていますか? –

+0

System.loadLibrary( "Abc")を呼び出すと、アンドロイドシステムはlibAbc.soファイルを適切なアーキテクチャのサブフォルダからロードします。したがって、デフォルトのアプリケーションjniディレクトリ( "app/src/main/jniLibs")内に(armeabi、armeabi-v7、x86)フォルダを配置すると、System.loadLibrary( "serial_port")を呼び出すことができます。それが動作します。グラデーションでjniパスを変更する必要はありません。 – srs

関連する問題