您的位置:首页 > 移动开发 > Android开发

Android studio2.2 NDK,JNI的简单使用

2017-01-12 15:07 627 查看
今天聊聊Android studio 2.2 添加C 和C++ 的代码

1.下载NDK和构建工具

要为您的应用编译和调试原生代码,您需要以下组件:

- Android 原生开发工具包 (NDK):这套工具集允许您为 Android 使用 C 和 C++ 代码,并提供众多平台库,让您可以管理原生 Activity 和访问物理设备组件,例如传感器和触摸输入。

- CMake:一款外部构建工具,可与 Gradle 搭配使用来构建原生库。如果您只计划使用 ndk-build,则不需要此组件。

- LLDB:一种调试程序,Android Studio 使用它来调试原生代码。

这三个工具是必须装的缺一不可。LLDB调试的, CMake编译的, NDK是api

您可以使用 SDK 管理器安装这些组件:

在打开的项目中,从菜单栏选择 Tools > Android > SDK Manager。

点击 SDK Tools 标签。

选中 LLDB、CMake 和 NDK 旁的复选框,如图 1 所示。



2.创建项目看下图:



中间几个步骤我就不贴图了,跟正常选择是一样的,关键就是这两个选择



在向导的 Customize C++ Support 部分,您可以使用下列选项自定义项目:

C++ Standard:使用下拉列表选择您希望使用哪种 C++ 标准。选择 Toolchain Default 会使用默认的 CMake 设置。

Exceptions Support:如果您希望启用对 C++ 异常处理的支持,请选中此复选框。如果启用此复选框,Android Studio 会将 -fexceptions 标志添加到模块级 build.gradle 文件的 cppFlags 中,Gradle 会将其传递到 CMake。

Runtime Type Information Support:如果您希望支持 RTTI,请选中此复选框。如果启用此复选框,Android Studio 会将 -frtti 标志添加到模块级 build.gradle 文件的 cppFlags 中,Gradle 会将其传递到 CMake。



在 cpp 组中,您可以找到属于项目的所有原生源文件、标头和预构建库。对于新项目,Android Studio 会创建一个示例 C++ 源文件 native-lib.cpp,并将其置于应用模块的 src/main/cpp/ 目录中。本示例代码提供了一个简单的 C++ 函数 stringFromJNI(),此函数可以返回字符串“Hello from C++”。要了解如何向项目添加其他源文件,请参阅介绍如何创建新的原生源文件的部分。

在 External Build Files 组中,您可以找到 CMake 或 ndk-build 的构建脚本。与 build.gradle 文件指示 Gradle 如何构建应用一样,CMake 和 ndk-build 需要一个构建脚本来了解如何构建您的原生库。对于新项目,Android Studio 会创建一个 CMake 构建脚本 CMakeLists.txt,并将其置于模块的根目录中。要详细了解此构建脚本的内容,请参阅介绍如何创建 Cmake 构建脚本的部分。

3.开始编译

1.点击Build -> Build APK ,会生成一个APK,如下图请自行浏览:



4.看代码

MainActivity.class代码:

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});

// Example of a call to a native method
TextView tv = (TextView) findViewById(R.id.sample_text);
tv.setText(stringFromJNI());
}

/**
* A native method that is implemented by the 'native-lib' native library,
* which is packaged with this application.
*/
public native String stringFromJNI(); //有点像JAVA声明一个方法一样

// Used to load the 'native-lib' library on application startup.
static {
System.loadLibrary("native-lib"); //加载这个文件的包名
}
}


native-lib代码:

#include <jni.h>
#include <string>

extern "C"
JNIEXPORT jstring JNICALL
Java_test_ndktest1_MainActivity_stringFromJNI( //该方法于public native String stringFromJNI()是相对应的
JNIEnv* env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}


原文:https://developer.android.com/studio/projects/add-native-code.html#download-ndk
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: