文章目录
1、前言
1.1 Android SDK介绍
Android是基于Linux内核的一个手机操作系统,谷歌提供了开发包(Android SDK),程序员可以通过开发包开发Android APP(应用程序)。Android SDK提供java语言接口,因此Android应用是使用java开发的
1.2 使用纯java开发App的特点
在某些场合下,使用纯Java开发Android应用程序并不完美,比如:
1>、有高性能算法,Java语言无法满足
2>、有跨平台需求,希望将app移植到ios
3>、已有代码的重用
1.3 引入NDK
早在Android 1.6(2009年)时,google就提供了NDk(native development kit),NDK包括了一套Android的交叉编译环境和开发库,利用它可以编写C/C++程序,并编译成Android环境下使用的动态库,Java代码通过Jni规范,调用C/C++写的动态库。
目前从Android Studio 2.2中及以上版本,集成了C/C++开发环境,开发人员在使用C/C++更加简单了。
2、环境搭建(简单说明,不做深入介绍)
2.1搭建Android开发环境
2.1.1安装JDK
2.1.2 安装Android Studio和SDK
2.2 Android NDK环境搭建
1>下载NDK开发包
2>解压缩Android NDK
3>将NDK解压到随意目录(但是目录不能包含中文和空格)。
4>配置NDK路径
5>查看是否配置Android NDK,如下说明已经配置好
3、java调用c++代码
3.1 ndk项目搭建
默认工具链、C++11、C++14,我这里选的C++11,
生成的项目工程,cpp文件里面是C++代码,java文件里面是java代码
3.2 java调用c++代码简单介绍
MainActivity 类
package com.luminal.ndktest;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
// Used to load the 'native-lib' library on application startup.
static {
System.loadLibrary("native-lib");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 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与c++方法映射关系1
stringFromJNI方法没有实现。它不像普通的 java方法,如onCreate方法 有大括号、方法体。
stringFromJNI没有方法体,那么它的方法体在哪里呢?在c++代码,native-lib.cpp里面,
其中关键字native代表stringFromJNI方法的代码不是用 java写的,而是用本地语言写的,
这里的本地语言就是指的 c 或 c++
当java调用stringFromJNI方法的时候,我们知道java代码在java虚拟机上运行,当java
虚拟机运行到stringFromJNI方法的时候,其实它就会去寻找
Java_com_luminal_ndktest_MainActivity_stringFromJNI方法,
这个方法在在c++代码,native-lib.cpp里面
#include <jni.h>
#include <string>
extern "C" JNIEXPORT jstring JNICALL
Java_com_luminal_ndktest_MainActivity_stringFromJNI(
JNIEnv *env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
***java与c++方法映射关系2
Java_com_luminal_ndktest_MainActivity_stringFromJNI方法名是怎么来的呢?
Java表示是java要调用的方法
com_luminal_ndktest Android的包名com.luminal.ndktest
MainActivity Android的类名
stringFromJNI Android的方法名
也就是jni规范规定了的格式,当java在调用native方法的时候,它就按照上面这种格式来找
Java_com_luminal_ndktest_MainActivity_stringFromJNI方法,
所以我们运行项目如下图,出现文字是 Hello from C++
而不是布局文件activity_main里面的 Hello World!