Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android studio 加載so文件的各種問題

android studio 加載so文件的各種問題

編輯:關於Android編程

在0.4.0版本時我總結了一篇文章,android studio V0.4.0調整。

之前的理解有點不到位,把最近的理解記錄下,大家幫我糾正,謝謝。


先上腳本代碼:

android {

    ......
    task copyNativeLibs(type: Copy) {
        from fileTree(dir: 'libs', include: '*/*.so' )  into  'build/native-libs'
    }
    tasks.withType(Compile) { compileTask -> compileTask.dependsOn copyNativeLibs }

    clean.dependsOn 'cleanCopyNativeLibs'

    tasks.withType(com.android.build.gradle.tasks.PackageApplication) { pkgTask ->
        pkgTask.jniFolders = new HashSet()
        pkgTask.jniFolders.add(new File(projectDir, 'build/native-libs'))
		println pkgTask.jniFolders
    }
}

1.先說copyNativeLibs,他的作用就是把dir中的so文件拷貝的主項目(例如app)的build/native-libs目錄下;

2.compileTask.dependsOn copyNativeLibs 把1中的task依賴於編譯任務,這樣每次在編譯前,就是把1中的copyNativeLibs方法執行;

3.clean.dependsOn 'cleanCopyNativeLibs'這行腳本容易理解,把clean build/native-libs 依賴於gradlew clean;

4.tasks.withType,在這塊腳本中需要注意理解兩點:

a.之前我們通過1把我們需要的so文件都拷貝到主項目(app)的build/native-libs中;

b.jniFolders,我的理解是打包時默認的jni文件目錄。把默認的jniFolders修改成我們自己指定的目錄,即build/native-libs,從而so文件便能夠被打入apk中。


有關多module的so文件加載:

首先,說說你的理解,多module項目,某個子moudle可能需要jni支持,同樣也面臨so文件打包問題。通過上面的例子我嘗試了幾種方案。

1.直接把所有子module的so文件都拷貝到主項目的libs中;

2.子module中的build.gradle同樣包含上述腳本,把build/native-libs修改成主項目的絕對路徑;

3.修改copyNativeLibs,這裡既然做so文件的拷貝操作,那我直接把子module的dir加入,下面是對應的腳本;

android {
	......
	task copyNativeLibs(type: Copy) {
        def libPath = project(':lib').projectDir.absolutePath + '/libs'
		println libPath
        from fileTree(dir: 'libs', include: '*/*.so' )  into  'build/native-libs'
        from fileTree(dir: libPath, include: '*/*.so' )  into  'build/native-libs'
    }
    tasks.withType(Compile) { compileTask -> compileTask.dependsOn copyNativeLibs }

    clean.dependsOn 'cleanCopyNativeLibs'

    tasks.withType(com.android.build.gradle.tasks.PackageApplication) { pkgTask ->
        pkgTask.jniFolders = new HashSet()
        pkgTask.jniFolders.add(new File(projectDir, 'build/native-libs'))
		println pkgTask.jniFolders
    }
}

說明:

a.project(':lib')中的lib是需要jni支持的子module,這裡書寫子module的具體名稱,可以參照setttings.gradle;

b.libPath獲取到子moudle下存放so文件的libs絕對目錄;

c.多個子module同樣方法處理;


以上解決方案是我本人多次嘗試得出的結論,如有理解偏差,歡迎留言或者郵件我(郵箱:[email protected]




  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved