布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.tz.ndk.cpp.MainActivity"
android:orientation="vertical">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="1.重载运算符: 重载'[]'"
android:onClick="clickCppOperatorBrackets"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="2.C++中继承: 语法"
android:onClick="clickCppExtendsGrammar"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="3.C++中继承:构造函数和初始化父类属性"
android:onClick="clickCppExtendsConstruct"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="4.C++中继承:成员函数重写"
android:onClick="clickCppExtendsFuncOverride"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="5.C++中继承:多继承"
android:onClick="clickCppExtendsMore"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="6.C++中继承:虚函数"
android:onClick="clickCppExtendsVirtualFunc"/>
</LinearLayout>
java类:
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
public class MainActivity extends AppCompatActivity {
static {
System.loadLibrary("native-lib");
}
private NDKCpp ndkCpp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ndkCpp = new NDKCpp();
}
public void clickCppOperatorBrackets(View v){
ndkCpp.callCppOperatorBrackets();
}
public void clickCppExtendsGrammar(View v){
ndkCpp.callCppExtendsGrammar();
}
public void clickCppExtendsConstruct(View v){
ndkCpp.callCppExtendsConstruct();
}
public void clickCppExtendsFuncOverride(View v){
ndkCpp.callCppExtendsFuncOverride();
}
public void clickCppExtendsMore(View v){
ndkCpp.callCppExtendsMore();
}
public void clickCppExtendsVirtualFunc(View v){
ndkCpp.callCppExtendsVirtualFunc();
}
}
public class NDKCpp extends Object{
//1.重载运算符: 重载'[]'
public native void callCppOperatorBrackets();
//2.C++中继承: 语法
public native void callCppExtendsGrammar();
//3.C++中继承:构造函数和初始化父类属性
public native void callCppExtendsConstruct();
//4.C++中继承:成员函数重写
public native void callCppExtendsFuncOverride();
//5.C++中继承:多继承
public native void callCppExtendsMore();
//6.C++中继承:虚函数
public native void callCppExtendsVirtualFunc();
}
c代码:
com_tz_ndk_cpp_NDKCpp.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_tz_ndk_cpp_NDKCpp */
#ifndef _Included_com_tz_ndk_cpp_NDKCpp
#define _Included_com_tz_ndk_cpp_NDKCpp
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_tz_ndk_cpp_NDKCpp
* Method: callCppOperatorBrackets
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppOperatorBrackets
(JNIEnv *, jobject);
JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppExtendsGrammar
(JNIEnv *, jobject);
JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppExtendsConstruct
(JNIEnv *, jobject);
JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppExtendsFuncOverride
(JNIEnv *, jobject);
JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppExtendsMore
(JNIEnv *, jobject);
JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppExtendsVirtualFunc
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
com_tz_ndk_cpp_NDKCpp.cpp
#include <iostream>
#include <android/log.h>
#include "com_tz_ndk_cpp_NDKCpp.h"
//1.重载运算符: 重载'[]'
#include "bean/CharArray.h"
JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppOperatorBrackets
(JNIEnv *, jobject){
CharArray charArray = CharArray(5);
//char类型的本质就是int类型
//我们给这个char数组保存A以后的字母
int value = 65;
for (int i = 0; i < charArray.size(); ++i) {
charArray.set(i,value);
value++;
}
//输出
for (int i = 0; i < charArray.size(); ++i) {
__android_log_print(ANDROID_LOG_INFO,"main","第%d值:%c",i,charArray.get(i));
}
}
//2.C++中继承: 语法
#include "bean/Company.h"
JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppExtendsGrammar
(JNIEnv *, jobject){
// TzCompany company;
// company.name = "潭州教育";
//在Java中:父类的引用可以指向子类的实例
//C++中是可以的
TzCompany tzCompany("潭州教育");
Company company = tzCompany;
}
//3.C++中继承:构造函数和初始化父类属性
JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppExtendsConstruct
(JNIEnv *, jobject){
//初始化父类的属性?
//总结:构造方法调用的顺序,先调用父类构造,在调用子类构造,先析构子类,再析构父类
//其实和Java一样
MiddleStudent middleStudent("Dream","男","不早恋");
middleStudent.toString();
}
//4.C++中继承:成员函数重写
JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppExtendsFuncOverride
(JNIEnv *, jobject){
// MiddleOneStudent oneStudent;
// oneStudent.puppylove();
//
// //怎么调用父类的呢?
// oneStudent.MiddleStudent::puppylove();
}
//5.C++中继承:多继承
JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppExtendsMore
(JNIEnv *, jobject){
//正常调用:出错
// UniversityTeacher universityTeacher;
// //一下代码存在歧义
// universityTeacher.name = "Dream";
//解决方案:虚继承
UniversityTeacher universityTeacher;
universityTeacher.name = "Draem";
//访问父类
__android_log_print(ANDROID_LOG_INFO,"main","姓名: %s",universityTeacher.name);
__android_log_print(ANDROID_LOG_INFO,"main","MiddleTeacher父类: %s",universityTeacher.MiddleTeacher::name);
__android_log_print(ANDROID_LOG_INFO,"main","HighTeacher父类: %s",universityTeacher.HighTeacher::name);
//打印地址
__android_log_print(ANDROID_LOG_INFO,"main","姓名地址: %p",&(universityTeacher.name));
__android_log_print(ANDROID_LOG_INFO,"main","MiddleTeacher父类地址: %p",&(universityTeacher.MiddleTeacher::name));
__android_log_print(ANDROID_LOG_INFO,"main","HighTeacher父类地址: %p",&(universityTeacher.HighTeacher::name));
}
//6.C++中继承:虚函数
//在Java中抽象类(继承),方法重载(当前类中),方法覆盖(基于继承)
//需求:
//什么是多态?
//分析什么是多态?
//案例:电脑的开机和关机?
#include "simple/ComputerManager.h"
#include "simple/MacComputer.h"
#include "simple/SurfaceBookComputer.h"
JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppExtendsVirtualFunc
(JNIEnv *, jobject){
ComputerManager computerManager;
MacComputer macComputer;
computerManager.startup(macComputer);
computerManager.shutdown(macComputer);
SurfaceBookComputer surfaceBookComputer;
computerManager.startup(surfaceBookComputer);
computerManager.shutdown(surfaceBookComputer);
//多态:增强系统可扩展性
//什么是动态多态:
//答:程序在编译阶段并不知道执行目标函数,而是等到运行的时候才指定目标函数,这就是动态多态
//别人问到了什么是多态?
//回答技巧:
//先把java回答,列举一个案例,写出来
//接下来在分析一下C++中的多态(virtual)
//ndk开发
//面试的技巧
//静态多态:当前类中(方法重载)
//动态多态:方法重写(基于继承)
//动态多态:在C++中称之为动态联编
//抽象
}
CharArray.h
#ifndef DREAM_NDK_CPP_11_9_18_SIMPLE_CHARARRAY_H
#define DREAM_NDK_CPP_11_9_18_SIMPLE_CHARARRAY_H
#include <iostream>
1.重载运算符: 重载'[]'
class CharArray {
private:
char* array;
int length;
public:
CharArray(int length);
~CharArray();
char get(int index);
void set(int index,char value);
int size();
public:
//重载'[]'运算符
char operator[](int index);
};
#endif
CharArray.cpp
#include "CharArray.h"
CharArray::CharArray(int length) {
if(length < 0){
length = 0;
}
//创建数组(开辟内存空间)
//在C语言中 malloc开辟内存空间创建数组
//在C++中new关键字开辟一块内存空间
this->array = new char[length];
this->length = length;
}
CharArray::~CharArray() {
if(this->array != NULL){
delete[] this->array;
this->array = NULL;
}
}
char CharArray::get(int index) {
return this->array[index];
}
void CharArray::set(int index, char value) {
this->array[index] = value;
}
int CharArray::size() {
return this->length;
}
char CharArray::operator[](int index) {
return this->array[index];
}
Company.h
#ifndef DREAM_NDK_CPP_11_9_18_SIMPLE_COMPANY_H
#define DREAM_NDK_CPP_11_9_18_SIMPLE_COMPANY_H
#include <android/log.h>
//2.C++中继承: 语法
//第一个内容:语法
//在Java中是:extends
//在C++中是:':'
//在C++中可以多继承
//普及一下:在OC和Swift语言中,继承的关键字也是':'
//语言通性(OOP思想)
//java面向对象编程思想
//class Company {
//
//};
//
//class TzCompany : public Company{
//
//};
//
//class TzSoftCompany : Company,TzCompany{
//
//};
//第二个内容:继承修饰符
//继续.....
//在C++中继承体系修饰符
//修饰符访问权限(属性身上)
//private:只允许在当前类中访问
//protected:允许在当前类中访问+子类中允许访问
//public:任何地方都允许访问
//属性修饰符(控制父类属性的访问)
//继承修饰符:修饰父类中的属性的访问权限(指的范围:子类和外部类)
//
//class Company {
//private:
// char* name;
//};
//
//class TzCompany : public Company{
// void toString(){
//
// }
//};
//第三个内容:父类和子类兼容
class Company {
private:
char* name;
public:
Company(){
}
//线上授课
void onlineTeaching(){
}
};
class TzCompany : public Company{
private:
//上课方式
char* type;
public:
TzCompany(char* type){
this->type = type;
}
void toString(){
__android_log_print(ANDROID_LOG_INFO,"main","线上授课");
}
};
//3.C++中继承:构造函数和初始化父类属性
//学生类
class Student{
private:
char* name;
char* sex;
public:
Student(){
}
Student(char* name,char* sex){
this->name = name;
this->sex = sex;
__android_log_print(ANDROID_LOG_INFO,"main","Student构造函数");
}
Student(char* name){
this->name = name;
__android_log_print(ANDROID_LOG_INFO,"main","Student构造函数");
}
~Student(){
__android_log_print(ANDROID_LOG_INFO,"main","Student析构函数");
}
};
//初中生
class MiddleStudent : public Student{
private:
//描述
char* desc;
Student womanStudent;
public:
MiddleStudent(){
}
MiddleStudent(char* name,char* sex,char* desc) : Student(name) ,womanStudent(name){
this->desc = desc;
__android_log_print(ANDROID_LOG_INFO,"main","MiddleStudent构造函数");
}
~MiddleStudent(){
__android_log_print(ANDROID_LOG_INFO,"main","MiddleStudent析构函数");
}
void toString(){
__android_log_print(ANDROID_LOG_INFO,"main","%s",this->desc);
}
void puppylove(){
__android_log_print(ANDROID_LOG_INFO,"main","初中生早恋了");
}
};
//4.C++中继承:成员函数重写
//注意:调用父类的函数或者属性,必须继承修饰符为public,默认是private
class MiddleOneStudent : public MiddleStudent{
public:
void puppylove(){
__android_log_print(ANDROID_LOG_INFO,"main","辣妈早,初一的也居然早恋了!");
}
};
//5.C++中继承:多继承
场景分析
//class Teacher{
//
//};
初中老师
//class MiddleTeacher : Teacher{
//
//};
高中老师
//class HighTeacher : Teacher{
//
//};
大学老师
//class UniversityTeacher : public MiddleTeacher,public HighTeacher{
//
//};
//场景分析
class Teacher{
public:
char* name;
};
//初中老师
class MiddleTeacher : virtual public Teacher{
};
//高中老师
class HighTeacher : virtual public Teacher{
};
//大学老师
class UniversityTeacher : virtual public MiddleTeacher,virtual public HighTeacher{
};
//解决方案:虚继承(关键字:virtual)
//虚继承:不同路径继承来的同名的成员属性只有一份拷贝,解决了不明确问题
#endif
Computer.h
#ifndef DREAM_NDK_CPP_11_9_18_SIMPLE_COMPUTER_H
#define DREAM_NDK_CPP_11_9_18_SIMPLE_COMPUTER_H
#include <android/log.h>
class Computer {
public:
//电脑开机
virtual void startup(){
__android_log_print(ANDROID_LOG_INFO,"main","电脑开机");
}
//关机
virtual void shutdown(){
__android_log_print(ANDROID_LOG_INFO,"main","电脑关机");
}
};
#endif
ComputerManager.h
#ifndef DREAM_NDK_CPP_11_9_18_SIMPLE_COMPUTERMANAGER_H
#define DREAM_NDK_CPP_11_9_18_SIMPLE_COMPUTERMANAGER_H
#include "Computer.h"
//OO设计(Java、C++、OC、Swift、C#、PHP思想是相通的)
//需求:希望管理器能够支持现有的电脑,同时还能够支持未来的电脑?
//可以支持,但是你会发现耦合
//一下方式称之为静态多态(很多垃圾代码)
//特别是做android端?
//继承(动态多态)
class ComputerManager {
public:
//电脑开机
void startup(Computer &computer){
computer.startup();
}
//关机
void shutdown(Computer &computer){
computer.shutdown();
}
};
#endif
LenvoComputer.h
#ifndef DREAM_NDK_CPP_11_9_18_SIMPLE_LENVOCOMPUTER_H
#define DREAM_NDK_CPP_11_9_18_SIMPLE_LENVOCOMPUTER_H
#include <android/log.h>
#include "Computer.h"
class LenvoComputer {
};
#endif
MacComputer.h
#ifndef DREAM_NDK_CPP_11_9_18_SIMPLE_MACCOMPUTER_H
#define DREAM_NDK_CPP_11_9_18_SIMPLE_MACCOMPUTER_H
#include <android/log.h>
#include "Computer.h"
class MacComputer : public Computer{
public:
//电脑开机
virtual void startup(){
__android_log_print(ANDROID_LOG_INFO,"main","Mac电脑开机");
}
//关机
virtual void shutdown(){
__android_log_print(ANDROID_LOG_INFO,"main","Mac电脑关机");
}
};
#endif
SurfaceBookComputer.h
#ifndef DREAM_NDK_CPP_11_9_18_SIMPLE_SURFACEBOOKCOMPUTER_H
#define DREAM_NDK_CPP_11_9_18_SIMPLE_SURFACEBOOKCOMPUTER_H
#include <android/log.h>
#include "Computer.h"
//微软的surfacebook电脑
class SurfaceBookComputer : public Computer{
public:
//电脑开机
void startup(){
__android_log_print(ANDROID_LOG_INFO,"main","SurfaceBook电脑开机");
}
//关机
void shutdown(){
__android_log_print(ANDROID_LOG_INFO,"main","SurfaceBook电脑关机");
}
};
#endif
整理自示例代码