Sou muito novo em todo esse suporte e no Android Studio. Consegui converter meu projeto Android para gradle usando a opção de exportação.
Mas estou procurando alguma documentação ou ponto de partida para integrar a compilação NDK ao processo de compilação gradle.
Se possível, também preciso de algum tipo de estágio "depois" que copie os binários de construção (arquivos .so) no diretório de ativos.
android
android-ndk
gradle
android-studio
plaisthos
fonte
fonte
Respostas:
Lançamos uma primeira versão da integração como uma prévia no 1.3: http://tools.android.com/tech-docs/android-ndk-preview
A integração permanecerá uma visualização mesmo depois que a 1.3 se tornar final. Nenhum ETA atual sobre quando será final (a partir de 10/07/2015).
Mais informações aqui: http://tools.android.com/tech-docs/android-ndk-preview
fonte
ATUALIZAÇÃO: O Android Studio com suporte a NDK já está disponível: http://tools.android.com/tech-docs/android-ndk-preview
Para criar com um script, a solução gradle abaixo deve funcionar:
Estou usando meu script de construção e adicionado ao meu arquivo (parece funcionar
0.8+
): isso parece ser equivalente à solução abaixo (mas parece melhor no arquivo gradle):Infelizmente, a compilação não falha se o diretório não estiver presente ou não contiver
.so
arquivos.fonte
tasks.withType(com.android.build.gradle.tasks.PackageApplication) { it.jniFolders = [file("libs")] as Set }
. Obrigado pela ajuda!jni.srcDirs = [] //disable automatic ndk-build
é muito importante, pois impede o Android Studio de reconstruir o código-fonte C / C ++. Estou tentando descobrir isso há dois dias, até que vi sua postagem e isso resolveu meu problema. Eu realmente acho que a compilação NDK é melhor criada separadamente apenas pelo makefile da linha de comando Android.mk, não pelo script gradle, já que o C / C ++ foi criado pelo Makefile por mais de 40 anos!Com a atualização do Android Studio para 1.0, o suporte à cadeia de ferramentas NDK melhorou imensamente ( nota: leia minhas atualizações na parte inferior desta postagem para ver o uso com o novo plugin experimental Gradle e o Android Studio 1.5 ).
O Android Studio e o NDK estão integrados o suficiente para que você apenas precise criar um bloco ndk {} no build.gradle do seu módulo e defina seus arquivos de origem no diretório (module) / src / main / jni - e você feito!
Chega de ndk-build a partir da linha de comando.
Eu escrevi tudo sobre isso no meu blog aqui: http://www.sureshjoshi.com/mobile/android-ndk-in-android-studio-with-swig/
Os pontos salientes são:
e coloque isso no build.gradle do seu módulo:
Esse é o processo de compilação do código C ++, a partir daí você precisa carregá-lo e criar wrappers - mas, a julgar pela sua pergunta, você já sabe como fazer tudo isso, para que eu não volte a usar o hash.
Além disso, coloquei um repositório Github deste exemplo aqui: http://github.com/sureshjoshi/android-ndk-swig-example
ATUALIZAÇÃO: 14 de junho de 2015
Quando o Android Studio 1.3 for lançado, deve haver um suporte melhor ao C ++ por meio do plug-in JetBrains CLion. Atualmente, estou no pressuposto de que isso permitirá o desenvolvimento de Java e C ++ no Android Studio; no entanto, acho que ainda precisamos usar a seção Gradle NDK, como afirmei acima. Além disso, acho que ainda haverá a necessidade de gravar arquivos wrapper Java <-> C ++, a menos que o CLion os faça automaticamente.
ATUALIZAÇÃO: 5 de janeiro de 2016
Atualizei meu blog e o repositório do Github (no ramo de desenvolvimento) para usar o Android Studio 1.5 com o mais recente plugin experimental Gradle (0.6.0-alpha3).
http://www.sureshjoshi.com/mobile/android-ndk-in-android-studio-with-swig/ http://github.com/sureshjoshi/android-ndk-swig-example
A compilação Gradle para a seção NDK agora se parece com isso:
Além disso, surpreendentemente, o Android Studio possui preenchimento automático para C ++ - wrappers gerados em Java usando a palavra-chave 'native':
No entanto, não é totalmente otimista ... Se você estiver usando o SWIG para quebrar uma biblioteca para gerar automaticamente o código e, em seguida, tentar usar a geração automática de palavras-chave nativas, ele colocará o código no lugar errado no seu swig _wrap .cxx ... Então você precisa movê-lo para o bloco "extern C":
ATUALIZAÇÃO: 15 de outubro de 2017
Seria negligente se não mencionasse que o Android Studio 2.2 em diante tem essencialmente suporte 'nativo' (sem trocadilhos) para a cadeia de ferramentas NDK via Gradle e CMake. Agora, quando você cria um novo projeto, basta selecionar o suporte ao C ++ e pronto.
Você ainda precisará gerar seu próprio código de camada JNI ou usar a técnica SWIG que mencionei acima, mas o andaime de um projeto C ++ no Android é trivial agora.
As alterações no arquivo CMakeLists (onde você coloca seus arquivos de origem C ++) serão capturadas pelo Android Studio e recompilarão automaticamente todas as bibliotecas associadas.
fonte
No Google IO 2015, o Google anunciou a integração completa do NDK no Android Studio 1.3.
Agora está fora de visualização e disponível para todos: https://developer.android.com/studio/projects/add-native-code.html
Resposta antiga: o Gradle liga automaticamente
ndk-build
se você tiver umjni
diretório nas fontes do projeto.Isso está funcionando no Android studio 0.5.9 (canary build).
Faça o download do NDK
Adicione
ANDROID_NDK_HOME
às variáveis de ambiente oundk.dir=/path/to/ndk
ao seulocal.properties
no seu projeto do Android Studio. Isso permite que o Android studio execute o ndk automaticamente.Faça o download dos projetos de amostra gradle mais recentes para ver um exemplo de projeto ndk. (Eles estão na parte inferior da página). Um bom exemplo de projeto é
ndkJniLib
.Copie o
gradle.build
dos projetos de amostra NDK. Será algo parecido com isto. Issogradle.build
cria um apk diferente para cada arquitetura. Você deve selecionar qual arquitetura deseja usar nobuild variants
painel.Observe que isso ignorará seus arquivos Android.mk e Application.mk. Como solução alternativa, você pode dizer ao gradle para desativar a chamada atuomatic do ndk-build e especificar o diretório das fontes do ndk manualmente.
Além disso, você provavelmente desejará chamar o ndk-build em seu script gradle build explicitamente, porque acabou de desativar a chamada automática.
fonte
tasks.all { task -> if (task.name.contains('Ndk')) task.enabled = false }
Eu encontrei "gradle 1.11 com.android.tools.build:gradleAdd.9.+" agora suporta ndk de pré-compilação, basta colocar o * .so no diretório src / main / jniLibs. ao construir o gradle, empacote o ndk no lugar certo.
aqui está o meu projeto
fonte
Como Xavier disse, você pode colocar seus pré-compilados em / src / main / jniLibs / se estiver usando o gradle 0.7.2+
retirado de: https://groups.google.com/d/msg/adt-dev/nQobKd2Gl_8/ctDp9viWaxoJ
fonte
A partir de agora (Android Studio v0.8.6), é bastante simples. Aqui estão as etapas para criar um aplicativo do tipo "Olá, mundo":
Baixe o NDK do Android e coloque a pasta raiz em algum lugar saudável - no mesmo local da pasta SDK, talvez.
Adicione o seguinte ao seu
local.properties
arquivo:ndk.dir=<path-to-ndk>
Adicione o seguinte ao seu arquivo build.gradle dentro do diretório
defaultConfig
fechamento, logo após aversionName
linha:ndk { moduleName="hello-world" }
Nos módulos do seu aplicativo
main
diretório , crie uma nova pasta chamadajni
.Nessa pasta, crie um arquivo chamado
hello-world.c
, que você verá abaixo.Veja o
Activity
código de exemplo abaixo para obter um exemplo de como chamar um método (ou é uma função?) Emhello-world.c
.hello-world.c
MainActivity.java
build.gradle
Encontre o código fonte completo de um aplicativo muito semelhante aqui (menos o NDK).
fonte
Java_me_mattlogan_ndktest_MainActivity_stringFromJNI
para o seu próprio :) :)Se você está no unix, a versão mais recente (0.8) adiciona o ndk-build. Veja como adicioná-lo:
Ele espera encontrar o JNI em 'src / main / jni', caso contrário, você pode defini-lo com:
A partir de 28 de janeiro de 2014, com a versão 0.8, a compilação estava quebrada no Windows, você deve desabilitar a compilação com:
fonte
Uma solução alternativa elegante é mostrada em https://groups.google.com/d/msg/adt-dev/nQobKd2Gl_8/Z5yWAvCh4h4J .
Basicamente, você cria um jar que contém "lib / armeabi / yourlib.so" e depois inclui o jar na compilação.
fonte
ndk-build
, gera.jar
s para cada.so
e os coloca em caminho de construção de Gradle para aliviar essa dor. Confira.Uma boa resposta para automatizar o empacotamento de
.so
arquivos- prontamente compilados é fornecida em outro thread (fechado) . Para fazer isso funcionar, tive que mudar de linha:para dentro:
Sem essa alteração, os
.so
arquivos não foram encontrados e, portanto, a tarefa de empacotá-los nunca seria executada.fonte
A resposta de @plaisthos quebrou na versão mais recente do gradle, mas ainda há uma maneira de fazê-lo. Crie um
native-libs
diretório na raiz do diretório do seu projeto e copie todas as nossas bibliotecas para esse diretório.Adicione as seguintes linhas ao seu build.gradle. Construa e seja feliz.
fonte
Este é o código que eu uso para construir usando o android-ndk da gradle. Para isso, adicione o caminho do diretório ndk em
gradle.properties
ie. adicionendkdir=/home/user/android-ndk-r9d
e coloque todos os arquivos jni em uma pastanative
,src/main/
como você pode ver no código postado abaixo. Ele criará jar com bibliotecas nativas que você pode usar normalmente como emSystem.loadLibrary("libraryname");
fonte
Usei o código a seguir para compilar bibliotecas nativas de caixas de depósito, estou usando o Android Studio v1.1.
fonte
Eu usei
ndk.dir=/usr/shareData/android-ndk-r11b
// caminho do ndkno arquivo local.properties no projeto android studio. e inclua esta linha:
android.useDeprecatedNdk=true
no arquivo gradle.properties no projeto android studio.
Mais informações aqui: http://tools.android.com/tech-docs/android-ndk-preview
fonte
Para expandir o que Naxos disse (obrigado Naxos por me enviar na direção certa!), Aprendi bastante com os exemplos NDK lançados recentemente e postei uma resposta em uma pergunta semelhante aqui.
Como configurar o NDK com o plugin Android Gradle 0.7
Esta postagem contém detalhes completos sobre como vincular bibliotecas nativas pré-criadas ao seu aplicativo para as várias arquiteturas, além de informações sobre como adicionar suporte NDK diretamente ao script build.gradle. Na maioria das vezes, você não precisa mais trabalhar com o zip e a cópia.
fonte
Aqui estão as etapas que eu usei para fazer o NDK funcionar no meu projeto do Android Studio. Usei este tutorial para me ajudar https://software.intel.com/pt-br/videos/using-the-ndk-with-android-studio
Para usar o NDK, você deve adicionar uma linha NDK ao local.properties. Então, sob o seu sdk.dir, adicione
Nos meus aplicativos build.gradle, tenho o seguinte código
moduleName é o nome que você deseja fornecer ao seu código nativo. Eu acredito que é assim que a biblioteca compartilhada será chamada. O ldLibs permite que eu faça logon no LogCat, stl é o stl que você deseja importar. Existem muitas opções, iguais ao NDK do Eclipse. ( http://www.kandroid.org/ndk/docs/CPLUSPLUS-SUPPORT.html )
cFlags ainda são uma certa quantidade de magia negra para mim. Não encontrei uma boa fonte para todas as opções e o que elas me dão. Pesquise em torno do StackOverflow o que você precisa, é onde eu o encontrei. Eu sei que o c ++ 11 me permite usar o novo padrão do c ++ 11.
Aqui está um exemplo de como eu registro no LogCat a partir do código nativo
fonte
configurar projeto no android studio a partir do eclipse: você precisa importar o projeto eclipse ndk para o android studio sem exportar para gradle e funciona, também é necessário adicionar o caminho do ndk em local.properties , se mostrar erro, adicionar
no arquivo build.gradle , crie a pasta e o arquivo jni usando o terminal e execute-o.
fonte
Agora que o Android Studio está no canal estável, é bastante simples executar as amostras do Android-ndk . Essas amostras usam o plug-in experimental ndk e são mais recentes do que as vinculadas na documentação online do Android NDK. Depois de saber que eles funcionam, você pode estudar os arquivos build.gradle, local.properties e gradle-wrapper.properties e modificar seu projeto de acordo. A seguir estão as etapas para fazê-los funcionar.
Vá para configurações, Aparência e comportamento, Configurações do sistema, SDK do Android, selecione a guia Ferramentas do SDK e verifique a versão 1.0.0 do Android NDK na parte inferior da lista. Isso fará o download do NDK.
Aponte para o local do NDK recém-baixado. Observe que ele será colocado no diretório sdk / ndk-bundle. Faça isso selecionando Arquivo, Estrutura do projeto, Local do SDK (à esquerda) e fornecendo um caminho no local Android NDK. Isso adicionará uma entrada ndk ao local.properties semelhante a este:
Eu construí e implantei com êxito todos os projetos no repositório dessa maneira, exceto gles3gni, codec nativo e construtor. Estou usando o seguinte:
Android Studio 1.3 build AI-141.2117773
amostras de android-ndk publicadas em 28 de julho de 2015 (link acima)
SDK Tools 24.3.3
NDK r10e extraído para C: \ Android \ sdk \ ndk-bundle
Gradle 2.5
Plug-in Gradle 0.2.0
Windows 8.1 64 bits
fonte
NDK Builds and gradle (basic)
Geralmente, criar com o NDK é tão simples quanto especificar corretamente um caminho ndkBuild para Android.mk ou um caminho cmake para CMakeLists.txt. Eu recomendo o CMake sobre o Android.mk antigo, porque o suporte a C / C ++ do Android Studio é baseado no CLion e usa o CMake como formato de projeto. Na minha experiência, isso tendeu a tornar o IDE mais responsivo em projetos maiores. Tudo o que é compilado no seu projeto será criado e copiado no APK automaticamente.
Adicionando bibliotecas pré-construídas ao projeto (avançado)
As bibliotecas estáticas (.a) na sua compilação NDK serão automaticamente incluídas, mas as bibliotecas dinâmicas pré-criadas (.so) precisarão ser colocadas
jniLibs
. Isso pode ser configurado usandosourceSets
, mas você deve adotar o padrão. Você NÃO PRECISA de nenhum comando adicional nobuild.gradle
ao incluir bibliotecas pré-construídas.O layout de
jniLibs
Você pode encontrar mais informações sobre a estrutura no Guia do usuário do Android Gradle Plugin .
Em seguida, você pode validar que o APK resultante contém seus arquivos .so, normalmente em
build/outputs/apk/
, usandounzip -l myApp.apk
para listar o conteúdo.Construindo bibliotecas compartilhadas
Se você estiver criando uma biblioteca compartilhada no NDK, não precisará fazer mais nada. Ele será agrupado corretamente no APK.
fonte
Basta adicionar essas linhas ao aplicativo
build.gradle
fonte
now.I pode carregar o tão sucesso!
1. adicione o arquivo .so a este caminho
| --src | - | --main | - | - | --java | - | - | --jniLibs | - | - | - | --armeabi | - | - Arquivos | - | - | -. so
2. adicione este código ao gradle.build
}
3)
System.loadLibrary("yousoname");
fonte
Se seu projeto foi exportado do eclipse, adicione os códigos abaixo no arquivo gradle:
2.Se você criar um projeto no Android studio:
crie uma pasta chamada jniLibs em src / main / , e coloque seus arquivos * .so na pasta jniLibs.
E copie o código como abaixo em seu arquivo gradle:
fonte
Embora eu acredite que SJoshi (oracle guy) tenha a resposta mais completa, o projeto SWIG é um caso especial, interessante e útil, mas não generalizado para a maioria dos projetos que se saíram bem com os projetos baseados em formigas SDK padrão + NDK. Todos nós gostaríamos de estar usando o Android studio agora, provavelmente, ou queremos uma cadeia de ferramentas de construção mais amigável para o IC para dispositivos móveis, que gradle oferece teoricamente.
Publiquei minha abordagem, emprestada de algum lugar (encontrei isso no SO, mas publiquei uma essência para o aplicativo build.gradle: https://gist.github.com/truedat101/c45ff2b69e91d5c8e9c7962d4b96e841 ). Em poucas palavras, recomendo o seguinte:
Gradle para Android tem sido uma bagunça na minha opinião, por mais que eu goste dos conceitos emprestados e da estrutura de diretórios opinativa de um projeto. Esse recurso NDK está "chegando em breve" há quase três anos ou mais.
fonte