[英]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.dir
和sdk.dir
在local.properties
寫android.useDeprecatedNdk=true
到gradle.properties
,我仍然不能讓這個計划,因為我無法找到cpu-features.h
在helloneon.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.h
和cpu-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.