您的位置:首页 > 编程语言 > Java开发

JNI 从C文件向Java文件传递多个参数

2015-09-25 16:41 357 查看
JNI C主函数

#include <jni.h>
#include <string.h>
#include <android/log.h>
#include "Provider.h"
#include "libCold_chain.h"

JNIEnv* jniEnv;

jint
Java_com_panasonic_communicationtest_StateConfirmFragment_openSerialDevice( JNIEnv* env, jobject thiz, jstring devName )
{
const char* devName_id = (*env)->GetStringUTFChars(env, devName, NULL);
if(jniEnv == NULL) {
jniEnv = env;
}

return openSerialDevice(devName_id);
}

jint
Java_com_panasonic_communicationtest_StateConfirmFragment_readSerialData( JNIEnv* env, jobject thiz )
{
long dataTest = 0;

if(jniEnv == NULL) {
jniEnv = env;
}

jclass class;
jfieldID send_instruction_record;
jfieldID receive_instruction_record;
class = (*env)->GetObjectClass(env, thiz);
if (class == NULL)
{
return -1;
}
send_instruction_record = (*env)->GetFieldID(env, class, "send_instruction_str", "Ljava/lang/String;");
receive_instruction_record = (*env)->GetFieldID(env, class, "receive_instruction_str", "Ljava/lang/String;");
if (send_instruction_record == NULL || receive_instruction_record == NULL)
{
return -1;
}

unsigned char* rcmdReq = malloc(9*sizeof(jchar));
unsigned char* rcmdRes = malloc(10*sizeof(jchar));

if(readSerialData(1, 1, 80, &dataTest, 500, rcmdReq, rcmdRes) == 0){

unsigned char* str1 = "hello fan sen!";
unsigned char* str2 = rcmdReq;

jstring jstr1 = (*env)->NewStringUTF(env, str1);
jstring jstr2 = (*env)->NewStringUTF(env, str2);
__android_log_print(ANDROID_LOG_INFO, "ComTest", rcmdReq);
if(jstr1 == NULL || jstr2 == NULL){
return 2;
}
(*env)->SetObjectField(env, thiz, send_instruction_record, jstr1);
(*env)->SetObjectField(env, thiz, receive_instruction_record, jstr2);

return dataTest;
}

return -1;
}

jint
Java_com_panasonic_communicationtest_StateConfirmFragment_closeSerialDevice( JNIEnv* env, jobject thiz, jint devFd )
{
if(jniEnv == NULL) {
jniEnv = env;
}

return closeSerialDevice(devFd);
}

//  ===========================================
jint
Java_com_panasonic_communicationtest_ParameterSettingFragment_openSerialDevice( JNIEnv* env, jobject thiz, jstring devName )
{
const char* devName_id = (*env)->GetStringUTFChars(env, devName, NULL);
if(jniEnv == NULL) {
jniEnv = env;
}

return openSerialDevice(devName_id);
}

jint
Java_com_panasonic_communicationtest_ParameterSettingFragment_readSerialData( JNIEnv* env, jobject thiz, jint devFd, jchar unitno, jshort addr, jlong data )
{
if(jniEnv == NULL) {
jniEnv = env;
}

unsigned char rcmdReq[10];
unsigned char rcmdRes[10];

return readSerialData(devFd, unitno, addr, data, 500, rcmdReq[10], rcmdRes[10]);
}

jint
Java_com_panasonic_communicationtest_ParameterSettingFragment_writeSerialData( JNIEnv* env, jobject thiz, jint devFd, jchar unitno, jshort addr, jlong data )
{
if(jniEnv == NULL) {
jniEnv = env;
}

unsigned char rcmdReq[10];
unsigned char rcmdRes[10];

return writeSerialData(devFd, unitno, addr, data, 500, rcmdReq[10], rcmdRes[10]);
}

jint
Java_com_panasonic_communicationtest_ParameterSettingFragment_closeSerialDevice( JNIEnv* env, jobject thiz, jint devFd )
{
if(jniEnv == NULL) {
jniEnv = env;
}

return closeSerialDevice(devFd);
}

//--------------------------------------
jstring
Java_com_panasonic_communicationtest_StateConfirmFragment_getStringFromJNI( JNIEnv* env, jobject thiz, jstring address )
{
const char* address_id = (*env)->GetStringUTFChars(env, address, NULL);
if(jniEnv == NULL) {
jniEnv = env;
}

//    return getString(address_id);
return (*env)->NewStringUTF(env, address_id);
}

jstring
Java_com_panasonic_communicationtest_ParameterSettingFragment_getStringFromJNI( JNIEnv* env, jobject thiz, jstring address )
{
const char* address_id = (*env)->GetStringUTFChars(env, address, NULL);
if(jniEnv == NULL) {
jniEnv = env;
}
return getString(address_id);
}

jstring
Java_com_panasonic_communicationtest_ParameterSettingFragment_setStringIntoJNI( JNIEnv* env, jobject thiz, jstring address )
{
const char* address_id = (*env)->GetStringUTFChars(env, address, NULL);
if(jniEnv == NULL) {
jniEnv = env;
}
return setString(address_id);
}


JNI C代码

extern long readSerialData(long devFd, unsigned char unitno, unsigned short addr, long *data, long timeout, unsigned char* rcmdReq, unsigned char* rcmdRes)
{
/*
* Test by fansen
*/

*data = 1;
int m = 0;
int n = 0;
unsigned char test[10] = "0123456789";    //{0xff,0x1f,0x07,0x08};
strcpy(rcmdReq, test);

//    rcmdReq = test;
//    for(m = 0; m <= 8; m++){
//        rcmdReq[m] = test[m];
//        LOGI("test1: %c", test[m]);
//    }

LOGI(rcmdReq);

//    char test2[10] = {0xff,0x1f,0x07,0x08,0x00,0x87,0x00,0x01};
//    __android_log_print(ANDROID_LOG_INFO, "ComTest", "Communication Test 2");
//    for(n = 0; n <= 9; n++){
//        rcmdReq
= test2
;
//    }

return OK;

/*
* Test over
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: