1. 程式人生 > >NDK學習:C與C++在Ndk中的區別

NDK學習:C與C++在Ndk中的區別

使用C++做ndk 某些程式碼簡單一些原因是 他給你封裝了一個 env結構體

#include<stdio.h>
#include"cn_itcast_cpp_DemoActivity.h"
#include <android/log.h>
#include<malloc.h>
#include<stdlib.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__)


char*   Jstring2CStr(JNIEnv*   env,   jstring   jstr)
{
	 char*   rtn   =   NULL;
	 jclass   clsstring   =   (env)->FindClass("java/lang/String");
	 jstring   strencode   =   (env)->NewStringUTF("GB2312");
	 jmethodID   mid   =   (env)->GetMethodID(clsstring,   "getBytes",   "(Ljava/lang/String;)[B");
	 jbyteArray   barr=   (jbyteArray)(env)->CallObjectMethod(jstr,mid,strencode); // String .getByte("GB2312");
	 jsize   alen   =   (env)->GetArrayLength(barr);
	 jbyte*   ba   =   (env)->GetByteArrayElements(barr,JNI_FALSE);
	 if(alen   >   0)
	 {
	  rtn   =   (char*)malloc(alen+1);         //"\0"
	  memcpy(rtn,ba,alen);
	  rtn[alen]=0;
	 }
	 (env)->ReleaseByteArrayElements(barr,ba,0);  //
	 return rtn;
}



JNIEXPORT jstring JNICALL Java_cn_itcast_cpp_DemoActivity_helloInC__
  (JNIEnv * env, jobject obj){
//   return 	(*env)->NewStringUTF(env,"haha from c");
     return      env->NewStringUTF("haha from cpp");//使用c++的方式比較簡潔 如何實現的參考jni.h
/*
 *   jstring NewStringUTF(const char* bytes)
    { return functions->NewStringUTF(this, bytes); }
 */
}


JNIEXPORT jstring JNICALL Java_cn_itcast_cpp_DemoActivity_helloInC__Ljava_lang_String_2
  (JNIEnv * env, jobject , jstring jstr){
	char* cstr = Jstring2CStr(env , jstr);
	LOGI("%s",cstr);

	return      env->NewStringUTF("haha from c __");
}

然後注意的一點是

android.mk檔案

   LOCAL_PATH := $(call my-dir)
   include $(CLEAR_VARS)
   LOCAL_CPP_EXTENSION := cpp //代表c++檔案的副檔名可以隨意 一般是cpp
   LOCAL_MODULE    := Hello
   LOCAL_SRC_FILES := Hello.cpp
   LOCAL_LDLIBS += -llog
   include $(BUILD_SHARED_LIBRARY)