JNI Eclipse項目導入到Android Studio詳細步驟

學習ndk開發,上課的demo項目是eclipse的,需要將eclipse的項目一直到Android Studio,發現帶JNI和so的文件移植起來需要改很多配置,花費了很長的時間,照着網上的文章博客修改,發現很多博客要麼就是寫了不是很清晰,對於我這種渣渣新手看了仍然很暈,所以自己移植成功後記錄一下,加強理解。

環境

Android Studio是3.2.0。首先用Android Studio選FIle,import Project

選擇要導入的eclipse項目

點擊OK

爲了方便這些選項都可以默認

創建完成時候,顯示的import-summary.txt是你操作的日誌,bug或者變更都可查看下。

發現此時build報錯,原因Could not find com.android.tools.build:gradle:3.2.1.後續新版AS沒這問題了,解決方法我這裏是在build.gradle,都加入google()方法,如圖:

重新build,這時又報錯

Manifest merger failed : uses-sdk:minSdkVersion 8 cannot be smaller than version 9 declared in library [com.android.support:support-v4:25.3.1] C:\Users\yrq\.gradle\caches\transforms-1\files-1.1\support-v4-25.3.1.aar\ac8b385265bb5dcb256b7626452cf3b1\AndroidManifest.xml as the library might be using APIs not available in 8
	Suggestion: use a compatible library with a minSdk of at most 8,
		or increase this project's minSdk version to at least 9,
		or use tools:overrideLibrary="android.support.v4" to force usage (may lead to runtime failures)

最低版本太低,將 build.gradle最低版本改成你支持的最低版本,不知道可以新建個項目去該項目此文件夾查看,我這裏把compileSdkVersion等一起都改成了我默認的。如圖

重新編譯發現又有這個錯 

發現出錯您的項目包含c++文件,但它不使用受支持的本地構建系統 ,解決方法,在gradle.properties加入

Android.useDeprecatedNdk=true 

如圖

build.gradle的buildTypes函數加入方法


 
 sourceSets {
            main {
                jni.srcDirs = ['libs']//設置禁止gradle生成Android.mk
            }
        }

如圖

build一下,然後此時右鍵app文件夾

選擇Link C++ Project with Gradle(不知道爲什麼不做之前2步添加sdk和添加上面的函數,再build就看不見這個選項),有兩種ndk-build和Cmake方法,我用第一個,選擇自己的Android.mk(感覺就像c的Makefile),然後選擇自己項目的這個文件所在。點ok重新build了。

接着又出現錯誤

一個錯我理解是老版本的關鍵詞和新版本關鍵詞用的不一樣,改變成提示的,compile改成dependencies,如下圖

 

另一個錯估計提示說最低版本那些東西不應該放在AndroidManifest.xml這個配置文件中,找到這個文件把寫最低版本的信息刪了,如圖

然後重新build。不再報錯,然後run。發現又報錯。如下

More than one file was found with OS independent path 'lib/x86_64/libtest_cpp.so'

網上說原因是依賴有多個名稱不同,但是功能相同的library,在項目根目錄下搜一下就可以發現多個如libstlport_shared.so'的同名文件,解決方法是在android加個代碼 

   packagingOptions {//加上這些代碼
        pickFirst 'lib/armeabi-v7a/libtest_cpp.so'//注意最後的名字跟你項目來寫,下面幾行也是
        pickFirst 'lib/armeabi-v8a/libtest_cpp.so'
        pickFirst 'lib/arm64-v8a/libtest_cpp.so'
        pickFirst 'lib/x86/libtest_cpp.so'
        pickFirst 'lib/x86_64/libtest_cpp.so'
    }

如圖加進去,加到之前加方法的那個android裏面

編譯運行 

 

運行成功。至此移植成功。

總結

即使移植成功,但是很多步驟還是不太理解爲什麼報這錯,還有要好好加強學習,後面是比較好的參考博客。 

參考

https://blog.csdn.net/mingchong2005/article/details/80763704

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章