##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); } } }
时间: 2024-10-16 00:38:33