zoukankan      html  css  js  c++  java
  • android114 c转换成c++

    ##C向C++改造
    1. 把c文件后缀名换成cpp
    2. Android.mk文件中的hello.c也要换成hello.cpp
    3. c++的使用的环境变量结构体中,访问了c使用的结构体的函数指针,函数名全部都是一样的,只是参数去掉了结构体指针
    4. 访问函数指针时,把env前面的*号去掉,因为此时env已经是一级指针
    5. clean,清除之前编译的残留文件
    6. 把声明函数的h文件放入jni文件夹中,include该h文件
    
    jni是java和C的中间人。
    
    
    其余都一样,hello.cpp

    #include <jni.h>
    #include "com_itheima_cplusplus_MainActivity.h"//C++函数要声明在使用,并把这个文件放入jni文件夹中,

    JNIEXPORT jstring JNICALL Java_com_itheima_cplusplus_MainActivity_helloC
    (JNIEnv * env, jobject obj){
    char* cstr = "hello from c";
    //return (*env)->NewStringUTF(env, cstr);   这是c的写法
    return env->NewStringUTF(cstr);
    }

     

    activity:

    package com.itheima.cplusplus;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.view.Menu;
    import android.view.View;
    import android.widget.Toast;
    
    public class MainActivity extends Activity {
    
        static{
            System.loadLibrary("hello");
        }
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    
    
        public void click(View v){
            Toast.makeText(this, helloC(), 0).show();
        }
        
        public native String helloC();
    }

    Android.mk

    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    
    LOCAL_MODULE    := hello
    LOCAL_SRC_FILES := hello.cpp
    
    include $(BUILD_SHARED_LIBRARY)

    com_itheima_cplusplus_MainActivity.h

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class com_itheima_cplusplus_MainActivity */
    
    #ifndef _Included_com_itheima_cplusplus_MainActivity
    #define _Included_com_itheima_cplusplus_MainActivity
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     com_itheima_cplusplus_MainActivity
     * Method:    helloC
     * Signature: ()Ljava/lang/String;
     */
    JNIEXPORT jstring JNICALL Java_com_itheima_cplusplus_MainActivity_helloC
      (JNIEnv *, jobject);
    
    #ifdef __cplusplus
    }
    #endif
    #endif

    分支c进程

    #include <jni.h>
    #include <android/log.h>
    #define LOG_TAG "System.out"  //重命名
    #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)//重命名
    #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)//重命名
    
    
    void Java_com_itheima_fork_MainActivity_callC(JNIEnv * env, jobject obj){
    
        //在当前进程分支出c进程,即使把java进程杀了,C进程也杀不掉,同时c进程可以把java进程又启动起来。
        int pid = fork();
        //如果为0,分支成功
        if(pid == 0){
            while(1){
                    LOGI("hello xiaozhi");
                    sleep(1);
            }
        }
    
    }
  • 相关阅读:
    Spring框架之环绕增强
    Spring框架之最终增强
    Spring框架使用注解实现IOC的配置
    [算法] 带有条件的全排列 [dfs + set]
    [算法] 字符串的全排列 [dfs 递归神技]
    [面试] 十七道海量数据处理面试题与Bitmap详解 [未细看]
    [算法] 输出 字符串的全部子组合 [dfs 递归神技]
    [linux] 进程间通讯的几种方式
    [面试] 在数组查找这样的数,它大于等于左侧所有数,小于等于右侧所有数
    [算法] 彻头彻尾理解二分检索 6 种变换
  • 原文地址:https://www.cnblogs.com/yaowen/p/5001781.html
Copyright © 2011-2022 走看看