2017-03-17 11 views
0

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"); 
} 

私たちは何か間違ったことをしたと我々はしていることと感じます何かが欠けている。議論も定義しなければならないし、ラッパーを書くべきだと思う。

だから、どんな助けにも感謝します。

+0

ネイティブ関数定義を含むJavaファイルで「javah」を実行します。正しいメソッド名でCヘッダファイルを出力します。このメソッドをCまたはC++ファイルに実装し、事前に構築された関数を呼び出します。すべて一緒にリンクすることを忘れないでください。 –

+0

@RichardCritten "...あなたのネイティブ関数定義を含むJavaファイル。"あなたはJavaの活動を意味しますか? –

+1

これに類似する行のJavaファイル: 'public native int function();'この行は、パラメータを取らずにintを返す 'function'というネイティブメソッドがあることをJavaに伝えます。 'javah'は、パッケージ、クラス、メソッドのシグネチャから正しいC関数定義を生成します。 –

答えて

0

Javaクラスで機能ネイティブメソッドは、C++側の

JNIEXPORT jstring JNICALL Java_my_package_name_MyClass_function(JNIEnv *env, jobject instance) 

を必要とします。 libnameはそのようなエクスポートされた機能を提供しないため、コメントで説明されているRichard Crittenのように、自分で準備する必要があります。あなたのラッパー関数をファイルjniWrapper.cppの横にAndroid.mkの横に置くことができます。

あなたのAndroid。MKが最後に

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 
LOCAL_MODULE := name 
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libname.a 
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/$(TARGET_ARCH_ABI) 
include $(PREBUILT_STATIC_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := jniWrapper 
LOCAL_SRC_FILES := jniWrapper.cpp 
LOCAL_STATIC_LIBRARIES := name 
include $(BUILD_SHARD_LIBRARY) 

のように見えることがあり、lodalLibrary()静的ライブラリをロードすることはできません。 Javaクラスの静的コンストラクタは次のようになります

static { 
    System.loadLibrary("jniWrapper"); 
} 
関連する問題