jni总结 .c
/************************************JNI_summary_c.c****************************************************/
/*
* JNI 总结
* 第一部分 .c
* com.dtBank.app.service 包名
* dTCPConnection 项目名
* JNIEXPORT 返回值 JNICALL Java_com_dtBank_app_service_dTCPConnection_本地c函数名称(JNIEnv *env, jclass cls)
*/
* JNI 总结
* 第一部分 .c
* com.dtBank.app.service 包名
* dTCPConnection 项目名
* JNIEXPORT 返回值 JNICALL Java_com_dtBank_app_service_dTCPConnection_本地c函数名称(JNIEnv *env, jclass cls)
*/
//c代码头文件
//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__);}
//返回值为 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(env, email, JNI_FALSE);
const char *ppasswd = (*env)->GetStringUTFChars(env, passwd, JNI_FALSE);
int ret = -1;
if ( NULL == pemail || NULL == ppasswd )
{
//释放jstring类型
(*env)->ReleaseStringUTFChars(env, email, pemail);
(*env)->ReleaseStringUTFChars(env, passwd, ppasswd);
//(注意:转换得来的字符串和释放时的字符串必须完全一样!如果要对转换得来的字符串作修改,必须用中间变量来代替使用)
const char *pemail = (*env)->GetStringUTFChars(env, email, JNI_FALSE);
const char *ppasswd = (*env)->GetStringUTFChars(env, passwd, JNI_FALSE);
int ret = -1;
if ( NULL == pemail || NULL == ppasswd )
{
//释放jstring类型
(*env)->ReleaseStringUTFChars(env, email, pemail);
(*env)->ReleaseStringUTFChars(env, passwd, ppasswd);
return ret;
}
}
//调用C函数 或者 写C代码
ret = test_ret_int(pemail, ppasswd,queueType);
ret = test_ret_int(pemail, ppasswd,queueType);
//C代码执行完成 释放jstring类型
(*env)->ReleaseStringUTFChars(env, email, pemail);
(*env)->ReleaseStringUTFChars(env, passwd, ppasswd);
(*env)->ReleaseStringUTFChars(env, email, pemail);
(*env)->ReleaseStringUTFChars(env, passwd, ppasswd);
return ret;
}
}
//返回值为 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(env, status);
}
//返回值为 jobjectArray
JNIEXPORT jobjectArray JNICALL Java_com_dtBank_app_service_dTCPConnection_demoRetJobjectArray(JNIEnv *env, jobject obj)
{
char element_string[265] ;
char element_num = 4;
unsigned int index_num = 0;
int datalen = 0;
{
char element_string[265] ;
char element_num = 4;
unsigned int index_num = 0;
int datalen = 0;
jclass cls = (*env)->FindClass(env, "java/lang/String");
jobjectArray share_list = (*env)->NewObjectArray(env, element_num, cls, NULL);
jobjectArray share_list = (*env)->NewObjectArray(env, element_num, cls, NULL);
srcdatalen = sizeof("demoRetJobjectArray");
datalen = ( (srcdatalen > 265) ? 265 : srcdatalen );
bzero(element_string,265);
memcpy(element_string,"demoRetJobjectArray",datalen);
datalen = ( (srcdatalen > 265) ? 265 : srcdatalen );
bzero(element_string,265);
memcpy(element_string,"demoRetJobjectArray",datalen);
//jstring
jstring jstr1;
jstr1 = (*env)->NewStringUTF(env, element_string);
jstring jstr1;
jstr1 = (*env)->NewStringUTF(env, element_string);
jstring jstr2;
jstr2 = (*env)->NewStringUTF(env, "love you !");
jstr2 = (*env)->NewStringUTF(env, "love you !");
//jint
jint Jint = 4;
jint Jint = 4;
//jbyteArray (主要用于不能被转码的string 如文件流等)
jbyteArray jdata_stream;
jdata_stream = (*env)->NewByteArray(datasize);
(*env)->SetByteArrayRegion(jdata_stream, 0, datasize, (const jbyte *)datastream);
jbyteArray jdata_stream;
jdata_stream = (*env)->NewByteArray(datasize);
(*env)->SetByteArrayRegion(jdata_stream, 0, datasize, (const jbyte *)datastream);
//jobjectArray 每个元素可以是任何类型
(*env)->SetObjectArrayElement(env, share_list, index_num++, jstr1);
(*env)->SetObjectArrayElement(env, share_list, index_num++, jstr2);
(*env)->SetObjectArrayElement(env, share_list, index_num++, Jint);
(*env)->SetObjectArrayElement(env, share_list, index_num, jdata_stream);
(*env)->SetObjectArrayElement(env, share_list, index_num++, jstr2);
(*env)->SetObjectArrayElement(env, share_list, index_num++, Jint);
(*env)->SetObjectArrayElement(env, share_list, index_num, jdata_stream);
return share_list;
}
/************************************Android.mk****************************************************/
LOCAL_PATH:=$(call my-dir)
#src_inc := \
# $(NDK_PROJECT_PATH)/include \
# $(NDK_PROJECT_PATH) \
# $(NDK_PROJECT_PATH)/iconv/include \
# $(NDK_PROJECT_PATH)/iconv/lib \
# $(NDK_PROJECT_PATH)/iconv/libcharset/include
# $(NDK_PROJECT_PATH)/include \
# $(NDK_PROJECT_PATH) \
# $(NDK_PROJECT_PATH)/iconv/include \
# $(NDK_PROJECT_PATH)/iconv/lib \
# $(NDK_PROJECT_PATH)/iconv/libcharset/include
include $(CLEAR_VARS)
#LOCAL_CFLAGS := -ggdb
# Debug version
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -g -llog -lc
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -g -llog -lc
# Release version
#LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -lc
#LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -lc
# JNI xCloud
LOCAL_MODULE :=Cdemo
LOCAL_SRC_FILES :=JNI_summary_c.c
#LOCAL_STATIC_LIBRARIES := libiconv
#LOCAL_STATIC_LIBRARIES := libiconv
#LOCAL_C_INCLUDES += $(src_inc)
#LOCAL_STATIC_LIBRARIES := libiconv
#LOCAL_C_INCLUDES += $(src_inc)
include $(BUILD_SHARED_LIBRARY)