4.NDK Android jni开发 C++ 基本语法 (相机图片美化)

c++语法:
1.指针的用法
2.对象的用法
3.结构体
4.宏
 
 
内存管理
哪些需要释放的资源
1.指针
2.数组
 
 

1.如何打印指针变量的值?
2.全局变量
 
 
工具:

windows:使用 Visual Studio (Graphical Interface) 编译

mac:xcode
c++生成的可执行文件:并生成 a.out 可执行文件。
2011 C++11 第三个C++标准
C++ 标识符内不允许出现标点字符,比如 @、& 和 %。C++ 是区分大小写的编程语言。因此,在 C++ 中,Manpower 和 manpower 是两个不同的标识符。
  •  
  • cv::Mat imgDst = convertTo3Channels(imgSrc);

    一::在C++中是什么意思

    今天又想了一下::在C++中是什么意思;

    表示作用域,和所属关系

    比如

    class A

    {  

    public:     int test();

    }

    int A::test()                  //表示test是属于A的

    {

     return 0;

    }

    类似的还有其他,就不列举了 -------------------- 比如 int a;

    void test ()

    {

      int a = ::a;       //用全局变量a,给本地变量a赋值

    }

     

    ::是运算符中等级最高的,它分为三种: 1)global scope(全局作用域符),用法(::name) 2)class scope(类作用域符),用法(class::name) 3)namespace scope(命名空间作用域符)

    ==============================
  • int main ()
    {
        int  var;
        int  *ptr;
        int  **pptr;
    
        var = 3000;
    
        // 获取 var 的地址
        ptr = &var;
    
        // 使用运算符 & 获取 ptr 的地址
        pptr = &ptr;
    
        // 使用 pptr 获取值
        cout << "var 值为 :" << var << endl;
        cout << "*ptr 值为:" << *ptr << endl;
        cout << "**pptr 值为:" << **pptr << endl;
    
        return 0;
    }

    二 &符号是什么作用?
    Mat convertTo3Channels(const Mat &binImg)

    memcpy函数

    功能

    memcpy指的是c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中

  • ,函数 memcpy() 用来复制内存到另一个位置。

    ReleaseFloatArrayElements和DeleteLocalRef之间有什么区别

   用完之后别忘了释放 

 
 三.typedef代表什么意思?
四  ->代表什么含义?
return detect_MobileNetSSD(tg_handle->net, img, rect);
五。
struct timeval tv;

C++ 日期 & 时间

//计算时间
long getCurrentTime()
{
   struct timeval tv;
   gettimeofday(&tv, NULL);
   return tv.tv_sec * 1000 + tv.tv_usec / 1000;
}
#include <time.h>
 
struct用法
// 声明一个结构体类型 Books
struct Books
{
    char  title[50];
    char  author[50];
    char  subject[100];
    int   book_id;
};

int main( )
{
    Books Book1;        // 定义结构体类型 Books 的变量 Book1
    Books Book2;        // 定义结构体类型 Books 的变量 Book2

    // Book1 详述
    strcpy( Book1.title, "C++ 教程");
    strcpy( Book1.author, "Runoob");
    strcpy( Book1.subject, "编程语言");
    Book1.book_id = 12345;
六:是什么语法?
delete handle;
 
七。对象如何初始?直接用就可以了吗?new ???
typedef struct _tongue_handle
{
   int magic;
   ncnn::Net net;
}
tongue_handle;
TONGUE_HANDLE tongue_init(JNIEnv *env, const char *paramPath, const char *modelPath)
{
   int rc = 0;
   tongue_handle *handle = new tongue_handle();
 

基础语法:
定义常量

在 C++ 中,有两种简单的定义常量的方式:

  • 使用 #define 预处理器。
  • 使用 const 关键字。
 
c++存储类相关:

存储类定义 C++ 程序中变量/函数的范围(可见性)和生命周期。这些说明符放置在它们所修饰的类型之前。下面列出 C++ 程序中可用的存储类:

  • auto
  • register
  • static
  • extern
  • mutable
  • thread_local (C++11)
 
volatile:
修饰符 volatile 告诉编译器不需要优化volatile声明的变量,让程序可以直接从内存中读取变量。对于一般的变量编译器会对变量进行优化,将内存中的变量值放在寄存器中以加快读写效率。
 
// 变量声明extern int abextern int cextern float f;

typedef 声明

您可以使用 typedef 为一个已有的类型取一个新的名字。下面是使用 typedef 定义一个新类型的语法:

<span style="color:#000000"><span style="color:#333333"><span style="color:#000088">typedef</span><span style="color:#000000"> type newname</span><span style="color:#666600">;</span> </span></span>
 
typedef void *TONGUE_HANDLE;
 

用完之后别忘了释放

  • 如何把数组转为数组指针?
    jbyte *yuv = env->GetByteArrayElements(yuvData, 0);
     
    基本的语法:
    如何判断一个指针是否为null?
    if(bgr.data==NULL){
       return -1;
    }
     
    如何校验一个对象为null?
     C++语言中,对象没有空和不空的概,只有对象指针才有空和不空的概念
      判断对象指针是否为空只需要和NULL常量进行比较即可
      如果相等,则为空,否则不为空
      另外对象虽然没有空和不空的概念bai,但是有有效和无效的概念
     
     
    const关键字:
    C++ const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不变的。如果在编程中确实有某个值保持不变,就应该明确使用const
    相当于java里面的final
    修饰内容:
    修饰指针:
     

    C++ 字符(char)指针

    char 指针可以看作是字符串, 比如说:

    const char *str="HelloWorld!";
    本人极不建议使用 char 指针,毕竟 std::string 可以完全替代其并且功能也比它强大,使用使用更加方便
    如何升级:
    把头文件和.a文件都升级
     
    找到substract_mean_normalize的实现类
  • 问题:如何知道你的语言是c?还是c++
  • 开发大全
  • https://blog.csdn.net/afei__/article/details/81290711
 
 
案例:
1.java字符串转jni
 
const char *paramPathC = env->GetStringUTFChars(paramPath, NULL);
const char *modelPathC = env->GetStringUTFChars(modelPath, NULL);
 
源码:
const char* GetStringUTFChars(jstring string, jboolean* isCopy)
{ return functions->GetStringUTFChars(this, string, isCopy); }
 
 
c++中没有String类型,用的是什么类型?如何转
c++中的字符串:
<span style="color:#000000"><span style="color:#333333"><span style="color:#000088">char</span><span style="color:#000000"> greeting</span><span style="color:#666600">[]</span> <span style="color:#666600">=</span> <span style="color:#008800">"Hello"</span><span style="color:#666600">;</span></span></span>

C++ 中的 String 类

#include <iostream>#include <string>
string str1 = "Hello";
2. 结构体定义,对象的定义
    int rc = 0;
   tongue_handle *handle = new tongue_handle();
//  if(NULL == handle)
//  return NULL;
   // rc = handle->net.load_param("./models/tongue_5classes_singlechannel.param");
   rc = handle->net.load_param(paramPath);//
   //��ȡ.param����ȡ�ɹ�ʱrc=0 ,�xȡ.h ��ȡ�ɹ�ʱrc!=0
   if(rc != 0)
   {
      //"load_person_param error"
      __android_log_print(ANDROID_LOG_DEBUG, "james", "load_person_param error :%d",rc);
      delete handle;
      return NULL;
   }
 
typedef struct _tongue_handle
{
   int magic;
   ncnn::Net net;
} tongue_handle;
3.自定义头文件.h
#ifndef __TONGUE_H__
#define __TONGUE_H__

typedef void *TONGUE_HANDLE;

TONGUE_HANDLE tongue_init(JNIEnv *env,const char *paramPath, const char *modelPath);

int tongue_uninit(TONGUE_HANDLE handle);

int tongue_detect(TONGUE_HANDLE handle, cv::Mat img, cv::Rect &box);

#endif//__TONGUE_H__
4.数组转成int8_t
jbyte *yuv = env->GetByteArrayElements(yuvData, 0);
typedef int8_t   jbyte;    /* signed 8 bits */
 (unsigned char *) yuv代码转换
cv::Mat imgSrc(height, width, CV_8UC3, (unsigned char *) yuv);
cv::Mat imgDst = convertTo3Channels(imgSrc);
::的含义:
5.cv的定义:
using namespace cv;
using namespace std;
 
<span style="color:#000000"><span style="color:#333333">98年以后的c++语言提供一个全局的命名空间namespace,可以避免导致全局命名冲突问题</span></span>
因此,当使用<iostream.h>时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现;当使用< iostream>的时候,该头文件没有定义全局命名空间,必须使用namespace std;这样才能正确使用cout。
#include <iostream.h>
using namespace std; 则出错
所以 要么写成
#include <iostream >
using namespace std;
要么写成
#include <iostream.h>
当然最好是前种
6.&用法
TongueInfo ti;
long processImage_time_start = getCurrentTime();
int rc = processImage(imgSrc, ti);
int processImage(cv::Mat src, TongueInfo &ti)
{
   //src > BGR
   cv::Rect rect;
   int rc;
   memset(&ti, 0, sizeof(ti));//清空先前存的结果
typedef struct _TongueInfo {
    bool isTongue;
    float togueLocation[4];
} TongueInfo;
下面函数要得到指针类型,所以要对结构体进行取址操作
memset(&ti, 0, sizeof(ti));//清空先前存的结果
或者:
将jbyteArray的数据复制到一个char数组。
char *chars = NULL;
  jbyte *bytes;
  bytes = env->GetByteArrayElements(bytearray, 0);
  int chars_len = env->GetArrayLength(bytearray);
  chars = new char[chars_len + 1];
  memset(chars,0,chars_len + 1);
  memcpy(chars, bytes, chars_len);
  chars[chars_len] = 0;
  env->ReleaseByteArrayElements(bytearray, bytes, 0);
7.计算时间:
//计算时间
long getCurrentTime()
{
   struct timeval tv;
   gettimeofday(&tv, NULL);
   return tv.tv_sec * 1000 + tv.tv_usec / 1000;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章