2014年11月20日 星期四

TegraNsight、JNI與android.library的恩怨情仇…

之前在開發Android專案的時候,JNI都是綁死在目前所開發的APP專案一起編譯,
放在其他Lib相依的時候,會造成無法call到所對應JNI函式的Bug。另一方面,自
己規劃好的Activity框架,也想把它Lib讓APP專案可以直接參照引用,而不是拉
進來一起編譯。編成JAR檔來引用是個好方法,但是如果所參照的Java Library有
引用到自己的Resource的話,會造成找不到對應Resource的問題,有沒有什麼解
法呢?「要怎麼做哩?要怎麼做哩?」


整理一下自己的相關心得如下:

//相依Library的部份
1.參照http://developer.android.com/tools/projects/projects-cmdline.html,理解Command設定
 Project.Property的流程
2.project.properties的檔案為下了Command所產生的Project.Property,沒辦法直接更改,改了除
 了沒用之外更可能造成編譯不過的問題
3.建立Android Lib Project(含JAVA,所用到的JNI及相關的static lib到SO裡)
a.使用GenerateLibProject.bat產生ndk-build base的專案(Library專案)
範例如下:
android create lib-project --name TestFramework --target android-15 --path . --package com.SmallBurger.TestFramework
b.建立Import an ndk-build Android Project,並Import ndk-build base專案所在的Folder位置
c.測試編譯專案是否運作正常

//建立APP的部份
1.建立Tegra Nsight APP(Android Application with Native code)專案,並使用
 UpdateAndroidProject.bat來設定所要Reference Lib路徑(ndk-build base專案所在的
 Folder位置)範例如下:
android update project -p . --target android-15 --library ../
2.修改Activity的Source Code(通常是把Activity修改成繼承Reference Lib的定義的Activity),
 並測試是否可正常編譯。
3.由於Reference Lib有用到所對應的.so(含JNI及所相依的C++ Source code),所以要記得在
 建製後事件將相關的so copy到Tegra-Android\Debug(或Release)\libs\armeabi-v7a

沒有留言:

張貼留言