【转】Create Hello-JNI with Android Studio
【转】Create Hello-JNI with Android Studio
访问需要翻墙。
没有翻译成中文是因为图片很详细,看不懂英文,根据图片一步一步也能完成。另外开发人员应该具备阅读英文技术博客的能力。
1. Overview

In this codelab, you'll learn how to use Android Studio to start Android NDK project development.
2. Create Java Sample App
- Find and start Android Studio on your development system:
a) Linux: Run studio.sh from your installed location
b) OSX: Find studio installation in Application folder, double click to
start
If this is the first time you run this version of Android Studio on this
system, Android Studio will prompt to import from previous settings, just
select "I do not have a previous version of Studio or I do not want
to import my settings", "Welcome to Android Studio" will be
displayed.
- Select "Start a new Android Studio
project". - On "New Project" page, change
"Application Name" to HelloAndroidJni, and leave the default
values for other fields.
- Click "Next", select "Basic
Activity" as our template in "Add an Activity to Mobile"
page
- Click "Next" all the way to
"Finish" to complete application creation.
This creates an Android "Hello World" Java app; your Android
Studio looks like:
- (Optional) Connect your Android Device with
USB cable if you have device available; otherwise, create an Emulator when
Android Studio prompts you in the next step. - Sync
, Build

and Run
, you will see the
following on your target device or Emulator:
- Configure the project to use gradle wrapper.
a) On Mac OS, menu "Android Studio" > "Preferences".
b) On Linux, menu "File" > "Settings".
c) Then "Build, Execution, Deployment" > "Build Tools"
> "Gradle".
d) Select "Use Default Gradle wrapper (recommended)", click
"OK".
- Configure Android Studio to download NDK
a) Menu "Tools" > "Android" > "SDK Manager"
b) Select tab "SDK Tools"
c) Check "Android NDK"[ or "NDK"] if it is not checked
- Sync
, Build
and Run
, you should see the same as in step 6.
3. Add
JNI Build Capability to HelloAndroidJni Project
Android Studio supports native
development via experimental plugin developed by Google, let's add it into our
project.
- Find the latest gradle-experimental plugin version[currently
is 0.7.2 at the writing]. Open project build.gradle in Android Studio's
"Project" window.
- Replace gradle plugin
classpath 'com.android.tools.build:gradle:2.1.0'
with your latest version[it does not have to be 0.7.2]:
classpath 'com.android.tools.build:gradle-experimental:0.7.2'
- Change to the latest gradle version (2.10 is required for plugin version 0.7.0).
Select Android Studio "Project" pane, "Gradle Scripts"
> "gradle-wrapper.properties (Gradle Version)" and change:
distributionUrl=https\://services.gradle.org/distributions/gradle-2.4-all.zip
to:
distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip - Convert the auto-generated module build.gradle
to Gradle's component model DSL.
Select Android Studio "Project" pane > "Gradle
Scripts" > "build.gradle (Module: app)" and replace:
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.1"
defaultConfig {
applicationId "com.google.sample.helloandroidjni"
minSdkVersion 22
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
// others below this line: no change
with:
apply plugin: 'com.android.model.application'
model {
android {
compileSdkVersion 23
buildToolsVersion "23.0.3"
defaultConfig {
applicationId "com.google.sample.helloandroidjni"
minSdkVersion.apiLevel 22
targetSdkVersion.apiLevel 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles.add(file('proguard-android.txt'))
}
}
}
}
// others below this line: no change
NOTE: the version numbers may be different on your system, and you do not need to change the version number -- just use them as is. Only changing the highlighted part would be fine!
- Sync
, Build
and Run
. You should still see the same "Hello World" on your target device.
4. Add JNI Code Into Project
- Check the NDK Path.
Select the menu "File" > "Project Structure" >
"SDK Location", "Android NDK Location" if it is not
set yet, then click "...", and browse to your NDK location and
click "OK" (you may also choose "download").
- Configure the module build.gradle to create
"hello-android-jni" shared lib.
Select Android Studio "Project" pane > "Gradle
Scripts" > "build.gradle (Module:app)", add the
following inside the "model" block, after "buildTypes" block.
buildTypes {
...
}
// New code
ndk {
moduleName "hello-android-jni"
}
// New code finished
- Add JNI function and load jni shared lib into project.
Select Android Studio "Project" pane > "app" >
"java" > "com.google.sample.helloandroidjni" >
"MainActivity", and add JNI function getMsgFromJni() and
System.loadLibrary() to the end of class MainActivity.
...
// new code
static {
System.loadLibrary("hello-android-jni");
}
publicnativeString getMsgFromJni();
// new code done
} // class MainActivity
- Sync , Build , there should be no errors from Android Studio.
Note:
- make sure library name is the same as moduleName inside build.gradle
- The "Build" step is just to build, do not load the built apk yet; if you load it, it will crash since there is no native implementation for getMsgFromJni() yet
- Generate the C/C++ prototype function for jni function getMsgFromJni().
In MainActivity.java file, "getMsgFromJni()" is highlighed with
red because Android Studio could not find its implementation; let's get it
implemented:
- Select function "getMsgFromJni()".
- Wait for context aware menu prompt

to appear. - Click on
to bring up the popup

- Select "Create Function
Java_com_google_example_helloandroidjni_MainActivity_getMsgFromJni". - Android Studio creates a prototype function
for getMsgFromJNI() in hello-android-jni.c file under the "jni"
folder. Both got created at once!
#include<jni.h> JNIEXPORT jstring JNICALL
Java_com_google_sample_helloandroidjni_MainActivity_getMsgFromJni(JNIEnv *env, jobject instance) { // TODO return (*env)->NewStringUTF(env, returnValue);
}
- Replace "returnValue" in the above code with our own message:
// TODO
return (*env)->NewStringUTF(env, "Hello From Jni");
- Display our JNI message in the application.
- Add an ID to the existing TextView.
Open "Android Studio" pane, "res" >
"layout" > "content_main.xml"[if you have chosen
template "Empty Activity" in step "Create Java Sample
App", you file might be "activity_main.xml" instead],
select "design" view, and click or "Hello World",
inside "Properties" pane, put "@+id/jni_msgView" into "ID" field:[The other way is to directly add into "text" view, and put id
in with android:id="@+id/jni_msgView".] - Display our jni message in the TextView.
In MainActivity::onCreate() function, append following code to the end of
the function:
((TextView) findViewById(R.id.jni_msgView)).setText(getMsgFromJni());
- Click the Run
button, you should see "Hello From Jni" in your target device.
- Browse the Native Code
- Select "NewStringUTF" inside hello-android-jni.c, "right click" to bring up the pop-up menu.
- Select "Go To", and "Implementation(s)".
- You will see the function implementation of "NewStringUTF".
- Select other code to explore the native code browsing feature.
5. Debugging JNI Code
- Click the Run/Debug Configuration
[For Android Studio version earlier than 2.2, select
. Android Studio
auto-generates this native debug configuration when it detects JNI code.
In this config, debug configurations are enabled by default. If
is not visible, close
this project and reopen it with Android Studio, it will be there; Android
Studio version 2.2 integrated the debug functionality into app configure]. - Open hello-android-jni.c inside Android
Studio. - Click the left edge of the native code to set
a breakpoint:
- Click the Debug button
, your android device should prompt "Waiting For
Debugger" message:
- Wait until Android Studio connects to the
debugger on your device ( it might take 1 - 2 minutes, depending on the
device and OS version ), and stops at the breakpoint.
- Click "env" inside the
"Variables" window at the bottom pane of Android Studio to
observe contents of env pointer. - Click "+" at the bottom of the
"Watches" window (next to "Variables") and add "env", Android Studio will bring the content
of env into watch window. The values should be the
same as the values in "Variables" window. - Click the "F8" key to step over, and
menu "Run" > "Resume Program" to continue the
execution.
[Note: if you are using Android Studio
RC 1.5 or better, you can set a breakpoint on getMsgFromJni() in Java code and
"trace into" JNI code]
项目源码 https://github.com/leon-HM/HelloAndroidJni
【转】Create Hello-JNI with Android Studio的更多相关文章
- Co-Debugging JNI with Android Studio and Visual Studio
Tutorials > Android > Integration with other tools > Co-Debugging JNI with Android Studio a ...
- JNI 在Android Studio利用NDK编译运行一个简单的c库
NDK开发,其实是为了项目需要调用底层的一些C/C++的一些东西:另外就是为了效率更加高些.如果你在Eclipse+ADT下开发过NDK就能体会到要么是配置NDK还要下载Cygwin,配置Cygwin ...
- apk反编译(6)ProGuard 工具 android studio版官方教程[作用,配置,解混淆,优化示例]
ProGuard In this document Enabling ProGuard (Gradle Builds) Configuring ProGuard Examples Decoding O ...
- 第七章 : Git 介绍 (上)[Learn Android Studio 汉化教程]
Learn Android Studio 汉化教程 [翻译]Git介绍 Git版本控制系统(VCS)快速成为Android应用程序开发以及常规的软件编程领域内的事实标准.有别于需要中心服务器支持的早期 ...
- Android Studio 中关于NDK编译及jni header生成的问题
之前由于工作原因使用grails这个基于groovy的框架做项目,对groovy感觉很好. 基于groovy的gradle构建系统对我而言自然也是好的没得说. Android Studio 正式版出来 ...
- Android Studio使用JNI
0x01 前言 本文讲述使用Android Studio通过静态注册.动态注册使用JNI的方法,以及加载第三方so文件的方法 0x02 Android Studio静态注册的方式使用JNI 1. 添加 ...
- Android studio 配置JNI环境
Android studio配置jni开发环境,主要配置是两个build文件,以及新建一个jni文件,放c代码. 代码如下1: apply plugin: 'com.android.model.app ...
- Android Studio 项目中集成百度地图SDK报Native method not found: com.baidu.platform.comjni.map.commonmemcache.JNICommonMemCache.Create:()I错误
Android Studio 项目中集成百度地图SDK报以下错误: java.lang.UnsatisfiedLinkError: Native method not found: com.baidu ...
- 超级简单的Android Studio jni 实现(无需命令行)
1.配置Anroid Studio(这步是关键) 使用[command+,] 打开Preferences,选择External Tools,点击加号框如下图: Paste_Image.png 点击+号 ...
随机推荐
- bzoj 3160 万径人踪灭 —— FFT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3160 求出关于一个位置有多少对对称字母,如果 i 位置有 f[i] 对,对答案的贡献是 2^ ...
- CentOS 6.5远程连接工具x shell
安装X shell 在Window系统下远程连接Linux,x shell只是一种远程连接工具,类似工具还有CRT.VNC.putty. 以下是安装X shell的注意事项 此选项中,如不把——初始数 ...
- apk重签名的两种方法
因为robotium要求被测应用和测试代码要有一致的签名, 所以需要将apk包重签名. 方法一:通过re-sign.jar来产生debug key的apk(不适用于jdk 7以上) re-sign.j ...
- 创建Python本地副本
创建本地副本后可以避免解释器找不到模块的情况. 1. 创建一个测试用的pl.py def printTest(): print("this is a test") 2. 将pl.p ...
- F#周报2019年第20期
新闻 2019年理事会活动 "实用的F#挑战"意见截止日期接近,不要忘记提交博客文章或者其它作品 接口中的默认实现 .NET Core 3.0里的性能增强 使用Try .NET创建 ...
- Maven虐我千百遍,我待Maven如初恋
前言 在如今的互联网项目开发当中,特别是Java领域,可以说Maven随处可见.Maven的仓库管理.依赖管理.继承和聚合等特性为项目的构建提供了一整套完善的解决方案,可以说如果你搞不懂Maven,那 ...
- 用Go语言异常机制模拟TryCatch异常捕捉
有的同学看到Go和TryCatch一起出现,心里可能会说,难道Go语言升级了,加入了try...catch语句.哈哈,其实Go语言从创建之初就没打算加入try...catch语句,因为创建Go的那帮大 ...
- gSoap传输二进制数据
最近使用gSoap传输二进制数据,遇到问题.gSoap不能一次传输二进制数据.所以使用分包传送. struct xsd_DwgInfo { ];//分包大小 int m_nReadSize;// bo ...
- 2014-6-28 NOIP模拟赛
[今天我出的三道题目全部是图论哦,请大家轻虐] 1.魔术球问题弱化版(ball.c/.cpp/.pas) 题目描述 假设有 n 根柱子,现要按下述规则在这 n 根柱子中依次放入编号为 1,2,3,…的 ...
- 一个Java语言所写的shop网站框架明细
核心框架Spring Framework :作为一个优秀的开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用 ...