簡體   English   中英

使用MAC OS X將hello-neon(ndk示例)導入Android Studio

[英]Import hello-neon (ndk samples) to Android Studio with MAC OS X

我是NDK,gradle和Android Studio(AS)的新手,在向AS導入hello-neon(ndk示例)時遇到了一些問題。 我的操作系統是MAC OS X Yosemite。

塞汀后ndk.dirsdk.dirlocal.propertiesandroid.useDeprecatedNdk=truegradle.properties ,我仍然不能讓這個計划,因為我無法找到cpu-features.hhelloneon.c

我搜索了幾種方法。 唯一有效的方法是添加

sourceSets.main {
    jni.srcDirs = []
}

build.gradle

之后,我們可以Make Project並將其安裝在Android VM上。 但是,當我打開它時,應用程序將崩潰。 為了找到原因,我發現, public native String stringFromJNI()HelloNeon.java不能鏈接到其在執行helloneon.c (“無法解析相應的Jni函數”)

仍然按照stackoverflow提供的指令,我使用ndk-build來構建源代碼(需要添加指向cpufeatures的環境變量)並將.so文件添加到這個項目中,就像我的項目結構的屏幕截圖一樣

在這樣做之后(添加.so文件),在HelloNeon.java中的HelloNeon.java仍然說“無法解析相應的Jni函數”。 但它可以是“Make Project”,可以在我的VM上成功運行!

我不知道它是否是一個很好的解決方案,因為AS仍然報告HelloNeon.java錯誤,即使它可以編譯。

然后我嘗試將以下句子添加到build.gradle

sourceSets.main {
    jniLibs.srcDir 'src/main/jinLibs' 
}

它不會改變任何事情。 (這些代碼可以刪除。 - by bullsy)

我也嘗試將cpu-features.hcpu-features.c復制到/ main / jni,然后我們可以找到cpu-features.h但是錯過了其他文件。

結果,我來這里尋求幫助。 你能幫我們指出我們所犯的錯誤和正確的解決方法嗎? 雖然對於這個領域的專家來說這是一個天真的問題,但我非常感謝你作為這個領域的新人的幫助。

非常感謝你!


這是我的build.gradle (模塊:app):

apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion "23.0.3"

    defaultConfig {
        applicationId "com.example.neon"
        minSdkVersion 4
        targetSdkVersion 4

        ndk {
            moduleName "helloneon"
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }

    sourceSets.main {
        jni.srcDirs = []
    }

    sourceSets.main {
        jniLibs.srcDir 'src/main/jinLibs' // <-- Set your folder here!
    }

}

這是我的另一個build.gradle (Project:hello-neon):

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.5.0'
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

這是我的settings.gradle

include ':app'
include ':cpufeatures'

我的Android Studio版本是1.5.1

我的ndk版本( ./ndk-build -version )是GNU Make 3.81

再次感謝。


UPDATE

謝謝你。 我在build.gradle添加了以下代碼:

task ndkBuild(type: Exec) {
    commandLine 'ndk-build', '-C', commandLine 'ndk-build', '-C', file('/Users/zhu/AndroidStudioProjects/hello-neon/app/src/main')
}

tasks.withType(JavaCompile) {
    compileTask -> compileTask.dependsOn ndkBuild
}

ndk-build “Make Project”時得到一些錯誤信息:

Information:Gradle tasks [:app:generateDebugSources, :app:generateDebugAndroidTestSources, :app:compileDebugSources, :app:compileDebugAndroidTestSources]
:app:preBuild UP-TO-DATE
:app:preDebugBuild UP-TO-DATE
:app:checkDebugManifest
:app:prepareDebugDependencies
:app:compileDebugAidl UP-TO-DATE
:app:compileDebugRenderscript UP-TO-DATE
:app:generateDebugBuildConfig UP-TO-DATE
:app:generateDebugAssets UP-TO-DATE
:app:mergeDebugAssets UP-TO-DATE
:app:generateDebugResValues UP-TO-DATE
:app:generateDebugResources UP-TO-DATE
:app:mergeDebugResources UP-TO-DATE
:app:processDebugManifest UP-TO-DATE
:app:processDebugResources UP-TO-DATE
:app:generateDebugSources UP-TO-DATE
:app:preDebugAndroidTestBuild UP-TO-DATE
:app:prepareDebugAndroidTestDependencies
:app:compileDebugAndroidTestAidl UP-TO-DATE
:app:processDebugAndroidTestManifest UP-TO-DATE
:app:compileDebugAndroidTestRenderscript UP-TO-DATE
:app:generateDebugAndroidTestBuildConfig UP-TO-DATE
:app:generateDebugAndroidTestAssets UP-TO-DATE
:app:mergeDebugAndroidTestAssets UP-TO-DATE
:app:generateDebugAndroidTestResValues UP-TO-DATE
:app:generateDebugAndroidTestResources UP-TO-DATE
:app:mergeDebugAndroidTestResources UP-TO-DATE
:app:processDebugAndroidTestResources UP-TO-DATE
:app:generateDebugAndroidTestSources UP-TO-DATE
:app:ndkBuild
make: *** /Users/zhu/AndroidStudioProjects/hello-neon/app/main: No such file or directory.  Stop.
Error:Execution failed for task ':app:ndkBuild'.
> Process 'command 'ndk-build'' finished with non-zero exit value 2
Information:BUILD FAILED

然后我使用/Applications/Android\\ Studio.app/Contents/MacOS/studio啟動AS,以便AS可以從bash讀取環境變量,這些代碼有效!

但是,這個.so文件將存儲在“/ Users / zhu / AndroidStudioProjects / hello-neon / app / src / main / libs”中,並且這些.so文件無法直接加載(似乎該項目只會加載。所以jniLibs中的文件/)。

結果,我應該補充一下

sourceSets.main {
    jniLibs.srcDir 'src/main/libs' 
}

如果沒有,我該怎么辦?

刪除此代碼:

sourceSets.main {
    jniLibs.srcDir 'src/main/jinLibs' // <-- Set your folder here!
}

因為您使用的是Android.mk,所以將jniLibs.srcDir設置為空是正確的。 這告訴構建系統不要覆蓋您的Android.mk文件。 為了正確構建,您需要從build.gradle調用ndk-build並將其指向您的jni目錄。 設置對ndk-build的調用可能如下所示:

// call regular ndk-build(.cmd) script from app directory
task ndkBuild(type: Exec) {
    if (Os.isFamily(Os.FAMILY_WINDOWS)) {
        commandLine 'ndk-build.cmd', '-C', file('src/main').absolutePath
    } else {
        commandLine 'ndk-build', '-C', file('src/main').absolutePath
    }
}

tasks.withType(JavaCompile) {
    compileTask -> compileTask.dependsOn ndkBuild
}

這些示例來自ph0b關於使用舊版本NDK的優秀教程 如果你有興趣在未來的某一時刻試圖實驗NDK的支持,當你舒服些,ph0b已發布了對一些偉大的東西太多

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM