libname.aと呼ばれる特定の事前ビルドされたネイティブライブラリがあるとします。 Javaアクティビティからネイティブライブラリに含まれるネイティブ関数を呼び出す必要があります。 Xhandle
は、ヘッダファイルに定義された構造体であるNDK - 事前ビルドされたライブラリを組み込み、Androidプロジェクトでネイティブ関数を呼び出す
DLLEXPORT int DLLCALL function(Xhandle handle, unsigned char *srcBuf, unsigned char *dstBuf);
:例では、メインヘッダファイルに格納され、このものです。次のように我々が持っている
ファイルが構成されています
armv6
|- header1.h
|- header2.h
|- ...
|- libname.a
armv7
|- header1.h
|- header2.h
|- ...
|- libname.a
x86
|- header1.h
|- header2.h
|- ...
|- libname.a
我々はAndroidのプロジェクトにこのライブラリをインポートする必要があります。 私たちがしたこと:
- NDKとCMakeツールがインストールされました。
- プロジェクトの作成時にC++サポートが選択されていることを確認しました。
- プロジェクトにjniディレクトリを作成し、上記のファイルをコピーしました。 (プロジェクトのルートフォルダに格納されている)
当社CMakeList.txt
ファイル:
LOCAL_PATH := $(call my-dir)
TARGET_ARCH_ABI := armv7
include $(CLEAR_VARS)
LOCAL_MODULE := name
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libname.a
LOCAL_EXPORT_C_INCLUDES := $(TARGET_ARCH_ABI)
include $(PREBUILT_STATIC_LIBRARY)
このすべては、読み取りから推定した
cmake_minimum_required(VERSION 3.4.1)
add_library(name
STATIC# We guessed it's a static due to the .a extension
IMPORTED # No source code (.c or .cpp) available)
は、我々はその後、JNIディレクトリ内Android.mk
ファイルを作成しました次のリンク:
今私達のJavaアクティビティでは、我々はこのような何かを追加する必要があります知っている:
public native int function();
// Used to load the 'native-lib' library on application startup.
static {
System.loadLibrary("name");
}
私たちは何か間違ったことをしたと我々はしていることと感じます何かが欠けている。議論も定義しなければならないし、ラッパーを書くべきだと思う。
だから、どんな助けにも感謝します。
ネイティブ関数定義を含むJavaファイルで「javah」を実行します。正しいメソッド名でCヘッダファイルを出力します。このメソッドをCまたはC++ファイルに実装し、事前に構築された関数を呼び出します。すべて一緒にリンクすることを忘れないでください。 –
@RichardCritten "...あなたのネイティブ関数定義を含むJavaファイル。"あなたはJavaの活動を意味しますか? –
これに類似する行のJavaファイル: 'public native int function();'この行は、パラメータを取らずにintを返す 'function'というネイティブメソッドがあることをJavaに伝えます。 'javah'は、パッケージ、クラス、メソッドのシグネチャから正しいC関数定義を生成します。 –