2017-05-18 59 views
2

私はこれで数日間苦労しています。現時点では私は、単純なC++プロジェクト(1つの.H & 1 .cppファイル)と(簡単に完璧に働いていた)NDK helloJNIのサンプルコードを含む最小限のアプリケーションでそれをテストしています:AndroidスタジオのCファイル内で共有ライブラリ(.so)メソッドを呼び出す

ターゲット インポートAndroidのメーカーに、既存のC/C++ファイル(プロジェクト)

アプローチ は異なる可能性(数十)のいくつかを試した後、私は/には、次のステップは、私の目的のために最善の解決策になるだろうと思ったと思う:

  1. Visual Studio 2015 "Android用共有ライブラリを作成する"(または何か)から[共有ライブラリを作成する](成功)
  2. src/main /にサブフォルダを持つjniLibsフォルダを作成します)
  3. src/main/jniLibsにAndroid.mkファイルを追加する必要があります(?)
  4. Include文: "lib"と ".so"を含まないSystem.loadLibrary( "Calculator") MainActivity

このライブラリは、Android.mkと同じように、フォルダjniLibsにAndroid Studioにリストされています。さらに、apkをビルドすると、ライブラリは正常に圧縮され(解凍によって検証されます)、何のエラーもありません。 BUT:ライブラリのメソッドを呼び出すにはどうすればよいですか?私は他のスレッドで提供されているさまざまなソリューションを試してみましたが、私は上記の私の.mkまたは私のステップで何かを逃したと思います。

Sのようなネイティブlib.cppで

  • 異なる#include <myLib>文を、試してみました
  • 異なるAndroid.mk設定(それでもないチュートリアルで私をずっと助けたので、私は、ファイルを作るために新たなんです私の特定の問題:サブフォルダのx86
  • および他の多くのようにlibCalculator.soため:))
  • その他の場所 - 単に気圧思い出さない(wasntme)

ご協力いただきありがとうございます。

Android.mk

LOCAL_PATH := $(call my-dir) 
APP_ABI := x86   

# library info  
include $(CLEAR_VARS) 
LOCAL_MODULE := Calculator 
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/Calculator.so 
LOCAL_EXPORT_C_INCLUDES := ..../Visual Studio 2015/Projects/SO_Library/SO_Library 
include $(BUILD_SHARED_LIBRARY) 

答えて

0

あなたは、Android NDKで行うことができます物事の多くは、あります。たとえば、カメラハードウェアはAndroid OSの中で最も重いハードウェアの1つです。顔や物を検出したり、効果を与えたり、何千もの機能にNDKが最適です。 いくつかは、あなたのステップのために役立ちます:

  1. あなたは構築されており、できるビルド済みの共有(.soという)ともAndroidのStudioで静的(.A)ライブラリ。 Visual Studioは必要ありません。
  2. メインフォルダにjniLibsフォルダを作成しないでください。あなたはgradle経由でプロジェクトをビルドするときに、すでにこのフォルダを作成し、ターゲットライブラリを配置します。もしあなたがビルド済みのライブラリを必要とするならば、これらのライブラリをmain/jni/libsフォルダに入れ、次にAndroid.mkをあらかじめビルドしておきます。
  3. jnilibsフォルダにAndroid.mkファイルを追加しないでください。このファイルをmain/jniフォルダに作成します。また、Application.mkファイル。
  4. 静的メソッドで必要なアクティビティでライブラリを呼び出します。このように:

    static { System.loadLibrary("my_library") } 
    

    "lib"と ".so"拡張子なし。

ネイティブメソッドを呼び出す場合は、「native」キーワードを使用します。例:

このメソッドを呼び出して、結果を得るだけです。しかし、グラデル側にndkを構築するには、このanswerを見てください。 Android.mkでライブラリを構築するために、これらのサンプルラインは多分あなたを助ける:

include $(CLEAR_VARS) 
ifneq (,$(filter $(TARGET_ARCH_ABI), armeabi-v7a x86 arm64-v8a x86_64)) 

LOCAL_MODULE := my_library 
LOCAL_SRC_FILES := $(LOCAL_SRC_LOCATION)/native1.cpp native2.cpp 
include $(BUILD_SHARED_LIBRARY) 
  • あなたが名前の何かを置くが、libと.soの拡張子を追加いけないことができます。 Ndkはすでにそれをやっています。
  • 私はすでにAndroid.mkの例を与えています。
  • Android.mkファイルを作成すると、ライブラリに適切なフォルダが配置されます。 main/libs/x86/libmy_library.soと同様です。

私はこの回答が役に立ちます。あなたはより多くの質問がある場合は、コメントに追加、私は私の答えを編集し、回答を追加します。

+0

私はライブラリをAndroid Studioからコンパイルするようにしました。 .mkファイルの大きな助けをありがとう、私は検索から多く誤解されました。今私はもう一つの質問があります:私はそれを達成することができなかったので、どのように私は実行することができます(.jni構文でラップされていない)メソッドは、サンプルnative-lib.cppと言うことができますか? –

+0

ようこそ!)。 .SOはメソッドではなく、共有ライブラリです。 C++ソースと静的ライブラリからビルドされています。 .SOライブラリに存在するメソッドを使用する場合は、 "native"キーワードを使用して呼び出すことができます。私はすでにそれを説明しました。 – JavadKhan

関連する問題