2017-01-14 9 views
2

AndroidスタジオからAndroidのネイティブアクティビティサンプルを取り出し、自分のネイティブアクティビティの実装でアプリのグルーの実装を置き換えました。だからここAndroidを使ってCMakeと共有ライブラリを構築するNDK

は、サンプルとほぼ同じ私のcmakeのファイルです:

cmake_minimum_required(VERSION 3.4.1) 

#my implementation 
add_library(android-impl STATIC 
      C:/android_libs/native-impl/Activity.cpp 
      ) 

# now build app's shared lib 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11") 

add_library(my-app SHARED 
      main.cpp 
      ) 

#add include directories 

target_include_directories(my-app PRIVATE 
          C:/android_libs/native-impl/) 

# add lib dependencies 
target_link_libraries(my-app 
         android 
         android-impl 
         EGL 
         GLESv1_CM 
         log) 

そして私はまた、Androidの中で指定されたこのような私の共有ライブラリの名前、ファイルの一覧:

<!-- Tell NativeActivity the name of our .so --> 
    <meta-data android:name="android.app.lib_name" 
     android:value="my-app" /> 

それはすべてのコンパイルが、私は私のデバイス上で実行すると、それは即座にエラーがスローされます。

Caused by: java.lang.IllegalArgumentException: Unable to load native library: /data/app/com.nativetest.myapp-1/lib/arm/libmy-app.so 

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.nativetest.myapp/android.app.NativeActivity}: java.lang.IllegalArgumentException: Unable to load native library: /data/app/com.nativetest.myapp-2/lib/arm/libmy-app.so 

Iドン私は、ネイティブアクティビティ用に用意されたサンプルから同じCmakeファイルをコピーし、アプリケーションのグルーを実装に置き換えただけで、共有ライブラリに別の名前を使用したため、理解できません。ここで

は、私が使用したサンプルからのファイルは、次のとおりです。 Cmakelist.txt AndroidManifest.xml

は、私は変更する必要がある何か他のものはありますか?

+0

どのようにAndroidアプリケーションを構築しますか? Android Studioを使用する場合は、.soファイルがAndroid Studioで見つけられ、.apkファイルにパッケージ化されていることを確認してください。 Check http://stackoverflow.com/questions/24357687/how-to-include-so-library-in-android-studio –

+0

はいAndroidスタジオを使用しています。私はプロセスなどの構築について多くのことを理解していませんが、.soファイルはありません。それをどのように生成するのですか?私はそれがcmakeファイルによって作成されることを期待していた – thp9

+0

.soファイルはうまく生成され、Android Studioはそれを見つけて、それを読み込むことができません。 – thp9

答えて

2

サンプルコードと私のコードを比較した後、私は最終的に何が間違っているかを理解しました.1行のコードがないことが原因でした。だから、 http://blog.beuc.net/posts/Make_sure_glue_isn__39__t_stripped/

問題は、私はよく何が起こっているのか理解していないのですから、私は私が見つけた唯一の説明にリンクします、コールバックを使用してネイティブの活動の実施に関連しているように見えます解決策は単純に、空の関数などをネイティブアクティビティの実装(サンプルコードではアプリケーションの接着剤)にするだけで、メインコードの共有ライブラリから呼び出す必要があります。

詳細について詳しく説明したい場合や、この回避策のより良い代替方法をご希望の場合は、歓迎します。

+0

あなたの** Activity.cpp **は[** android_native_app_glue.c **](https:// github。co.jp/chicken-mobile/android-ndk/blob/master/android-native-app/android_native_app_glue.c)をご覧ください。この場合、** my-app ** SHAREDライブラリのソースリストにこのファイルを追加するだけで、** android-impl ** STATICライブラリへの参照をすべて削除することができます。 Googleサンプルで静的ライブラリが使用されている理由はわかりません。静的なlibの問題は、リンカがこれらの部分が必要であることを理解できない場合、その部分が(最適化された)(結果として生じるSHAREDライブラリから消去される)ことです。 –

関連する問題