/************************************JNI_summary_cpp.cpp****************************************************/
/*
* JNI 总结
* 第二部分 .cpp
* com.dtBank.app.service 包名
* dTCPConnection 项目名
* JNIEXPORT 返回值 JNICALL Java_com_dtBank_app_service_dTCPConnection_本地c函数名称(JNIEnv *env, jclass cls)
*/
* JNI 总结
* 第二部分 .cpp
* com.dtBank.app.service 包名
* dTCPConnection 项目名
* JNIEXPORT 返回值 JNICALL Java_com_dtBank_app_service_dTCPConnection_本地c函数名称(JNIEnv *env, jclass cls)
*/
//cpp代码头文件
//TO DO
//JNI头文件
#include <jni.h>
#include <android/log.h>
#include <jni.h>
#include <android/log.h>
//JNI 输入定义
#define TAG "myprint"
#define PT(...) {(void)__android_log_print(ANDROID_LOG_DEBUG,TAG,__VA_ARGS__);}
#ifdef __cplusplus
extern "C" {
#endif
//返回值为 void
JNIEXPORT void JNICALL Java_com_dtBank_app_service_dTCPConnection_demoRetVoid(JNIEnv *env, jclass cls)
{
//to do
//本地的c代码,或者条用c函数
test_ret_void();
return;
}
}
//返回值为 int
JNIEXPORT jint JNICALL Java_com_dtBank_app_service_dTCPConnection_demoRetInt
(JNIEnv *env, jclass cls, jstring email, jstring passwd, jint queueType)
{
JNIEXPORT jint JNICALL Java_com_dtBank_app_service_dTCPConnection_demoRetInt
(JNIEnv *env, jclass cls, jstring email, jstring passwd, jint queueType)
{
//类型转换 jint -> int :可以直接使用 无须转换 也无须释放
//类型转换 jstring -> string 须转换 也须释放
//(注意:转换得来的字符串和释放时的字符串必须完全一样!如果要对转换得来的字符串作修改,必须用中间变量来代替使用)
const char *pemail = env->GetStringUTFChars(email, 0);
const char *ppasswd = env->GetStringUTFChars(passwd, 0);
int ret = -1;
if ( NULL == pemail || NULL == ppasswd )
{
//释放jstring类型
env->ReleaseStringUTFChars(email, pemail);
env->ReleaseStringUTFChars(passwd, ppasswd);
//(注意:转换得来的字符串和释放时的字符串必须完全一样!如果要对转换得来的字符串作修改,必须用中间变量来代替使用)
const char *pemail = env->GetStringUTFChars(email, 0);
const char *ppasswd = env->GetStringUTFChars(passwd, 0);
int ret = -1;
if ( NULL == pemail || NULL == ppasswd )
{
//释放jstring类型
env->ReleaseStringUTFChars(email, pemail);
env->ReleaseStringUTFChars(passwd, ppasswd);
return ret;
}
}
//调用C函数 或者 写C代码
ret = test_ret_int(pemail, ppasswd,queueType);
ret = test_ret_int(pemail, ppasswd,queueType);
//C代码执行完成 释放jstring类型
env->ReleaseStringUTFChars(email, pemail);
env->ReleaseStringUTFChars(passwd, ppasswd);
env->ReleaseStringUTFChars(email, pemail);
env->ReleaseStringUTFChars(passwd, ppasswd);
return ret;
}
}
//返回值为 bool
JNIEXPORT jboolean JNICALL Java_com_dtBank_app_service_ClientConnection_demoRetBool
(JNIEnv *env, jclass cls)
{
bool retbool = false;
JNIEXPORT jboolean JNICALL Java_com_dtBank_app_service_ClientConnection_demoRetBool
(JNIEnv *env, jclass cls)
{
bool retbool = false;
//TO DO
//本地的c代码,或者条用c函数 填充status
//本地的c代码,或者条用c函数 填充status
return retbool;
}
}
//返回值为 jstring
JNIEXPORT jstring JNICALL Java_com_dtBank_app_service_dTCPConnection_demoRetJstring
(JNIEnv *env, jclass cls)
{
JNIEXPORT jstring JNICALL Java_com_dtBank_app_service_dTCPConnection_demoRetJstring
(JNIEnv *env, jclass cls)
{
char status[256];
bzero(status,256);
bzero(status,256);
//本地的c代码,或者条用c函数 填充status
return env->NewStringUTF(status);
}
//返回值为 jobjectArray
JNIEXPORT jobjectArray JNICALL Java_com_dtBank_app_service_dTCPConnection_demoRetJobjectArray(JNIEnv *env, jobject obj)
{
{
int ret = 2;
int datasize = 56;
char datastream[256] = "………………………………………………";
int datasize = 56;
char datastream[256] = "………………………………………………";
char return_num[1] = { 0 };
char stream_size[5] = { 0 };
sprintf(return_num,"%d",ret);
sprintf(stream_size,"%d",datasize);
PT("ret :%d\tdatasize:%d ",ret,datasize);
PT("return_num:%s\tstream_size :%s",return_num,stream_size);
char stream_size[5] = { 0 };
sprintf(return_num,"%d",ret);
sprintf(stream_size,"%d",datasize);
PT("ret :%d\tdatasize:%d ",ret,datasize);
PT("return_num:%s\tstream_size :%s",return_num,stream_size);
//获取object所属类,一般为ava/lang/Object就可以了
jclass objClass = (env)->FindClass("java/lang/String");
jobjectArray thumb_info = (env)->NewObjectArray(3, cls, 0);
//数据准备
jstring jstatus = env->NewStringUTF(return_num);
jstring jstream_size = env->NewStringUTF(stream_size);
jclass objClass = (env)->FindClass("java/lang/String");
jobjectArray thumb_info = (env)->NewObjectArray(3, cls, 0);
//数据准备
jstring jstatus = env->NewStringUTF(return_num);
jstring jstream_size = env->NewStringUTF(stream_size);
jbyteArray jdata_stream;
jdata_stream = (env)->NewByteArray(datasize);
(env)->SetByteArrayRegion(jdata_stream, 0, datasize, (const jbyte *)datastream);
jdata_stream = (env)->NewByteArray(datasize);
(env)->SetByteArrayRegion(jdata_stream, 0, datasize, (const jbyte *)datastream);
//填充
(env)->SetObjectArrayElement(thumb_info, 0, jstatus);
(env)->SetObjectArrayElement(thumb_info, 1, jstream_size);
(env)->SetObjectArrayElement(thumb_info, 2, jdata_stream);
(env)->SetObjectArrayElement(thumb_info, 0, jstatus);
(env)->SetObjectArrayElement(thumb_info, 1, jstream_size);
(env)->SetObjectArrayElement(thumb_info, 2, jdata_stream);
(env)->DeleteLocalRef(jstatus);
(env)->DeleteLocalRef(jstream_size);
(env)->DeleteLocalRef(jdata_stream);
(env)->DeleteLocalRef(jstream_size);
(env)->DeleteLocalRef(jdata_stream);
return share_list;
}
#ifdef __cplusplus
}
#endif
}
#endif
/************************************Android.mk****************************************************/
LOCAL_PATH := $(call my-dir)
LOCAL_CPP_EXTENSION:=.cpp
include $(CLEAR_VARS)
LOCAL_MODULE := CPPdemo
LOCAL_SRC_FILES := JNI_summary_cpp.cpp
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -ldl -llog
LOCAL_CPP_FEATURES:=rtti exceptions #此语句在linux环境下可以不用
include $(BUILD_SHARED_LIBRARY)
LOCAL_CPP_EXTENSION:=.cpp
include $(CLEAR_VARS)
LOCAL_MODULE := CPPdemo
LOCAL_SRC_FILES := JNI_summary_cpp.cpp
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -ldl -llog
LOCAL_CPP_FEATURES:=rtti exceptions #此语句在linux环境下可以不用
include $(BUILD_SHARED_LIBRARY)
/************************************Application.mk****************************************************/
#此文件在linux环境下可以不用
APP_STL := gnustl_static