##C向C++改造1. 把c文件后缀名换成cpp2. Android.mk文件中的hello.c也要换成hello.cpp3. 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 := helloLOCAL_SRC_FILES := hello.cppinclude $(BUILD_SHARED_LIBRARY)
com_itheima_cplusplus_MainActivity.h
/* DO NOT EDIT THIS FILE - it is machine generated */#include/* Header for class com_itheima_cplusplus_MainActivity */#ifndef _Included_com_itheima_cplusplus_MainActivity#define _Included_com_itheima_cplusplus_MainActivity#ifdef __cplusplusextern "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#include #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); } }}
本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/5001781.html,如需转载请自行联系原作者