【转】Create Hello-JNI with Android Studio

From:https://codelabs.developers.google.com/codelabs/android-studio-jni/index.html?index=..%2F..%2Findex#4

访问需要翻墙。

没有翻译成中文是因为图片很详细,看不懂英文,根据图片一步一步也能完成。另外开发人员应该具备阅读英文技术博客的能力。

1. Overview

In this codelab, you'll learn how to use Android Studio to start Android NDK project development.

2. Create Java Sample App

  1. 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. 
  2. Select "Start a new Android Studio
    project".
  3. On "New Project" page, change
    "Application Name" to HelloAndroidJni, and leave the default
    values for other fields.
  4. Click "Next", select "Basic
    Activity" as our template in "Add an Activity to Mobile"
    page
  5. Click "Next" all the way to
    "Finish" to complete application creation.
    This creates an Android "Hello World" Java app; your Android
    Studio looks like:
  6. (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.
  7. Sync

    , Build

     and Run , you will see the
    following on your target device or Emulator:

  8. 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".
  9. 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
  10. 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.

  1. 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.
  2. 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'
  1. 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
  2. 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!

  1. Sync , Build and Run . You should still see the same "Hello World" on your target device.

4. Add JNI Code Into Project

  1. 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").
  2. 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
  1. 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
  1. 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
  1. 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");
  1. 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());
  1. Click the Run button, you should see "Hello From Jni" in your target device.
  2. 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

  1. 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].
  2. Open hello-android-jni.c inside Android
    Studio.
  3. Click the left edge of the native code to set
    a breakpoint:                                                                         
  4. Click the Debug button

    , your android device should prompt "Waiting For
    Debugger" message:

  5. 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. 
  6. Click "env" inside the
    "Variables" window at the bottom pane of Android Studio to
    observe contents of env pointer.
  7. 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.
  8. 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

最新文章

  1. NOI2001|POJ1182食物链[种类并查集 向量]
  2. webserer错误
  3. Ajax-jQuery实现
  4. 模拟京东商城登陆HttpRequest
  5. 关于iTerm和Zsh
  6. asp.net 后台使用js弹窗失效问题
  7. 仿QQ好友列表界面的实现
  8. 我的 Azure VM 为何会重新启动?
  9. hdu_5873_Football Games(xjb搞)
  10. Android开发模板代码(一)——简单打开图库选择照片
  11. 使用Visual Studio Team Services敏捷规划和项目组合管理(五)——组合管理
  12. D2
  13. WKWebView 加载本地HTML随笔
  14. 服务器重新启动,oracle数据库重新连接问题
  15. mac下的tcp抓包
  16. SqlServer数据库设计一个字段的值是由其他字段运算结果所得
  17. Anaconda完全入门指南
  18. Unity3D 学习 创建简单的按钮、相应事件
  19. plsql链接数据库配置
  20. 【POJ】2043.Area of Polygons

热门文章

  1. webpack 知识点总结
  2. NLTK vs SKLearn vs Gensim vs TextBlob vs spaCy
  3. 简单易用&quot;里程碑&quot;、&quot;时间轴&quot;&lt;iOS小组件&gt;
  4. mina框架之---服务端NioSocketAcceptor的学习
  5. 技术胖Flutter第四季-20导航的参数传递和接受-1
  6. java 多线程,sleep()和wait()
  7. 洛谷 - P1381 - 单词背诵 - 哈希 - 尺取
  8. Codeforces712C【贪心】
  9. 微信API接口文档
  10. 51nod1640(kruscal)