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

JNI C主函数

  1 #include <jni.h>
  2 #include <string.h>
  3 #include <android/log.h>
  4 #include "Provider.h"
  5 #include "libCold_chain.h"
  6
  7 JNIEnv* jniEnv;
  8
  9 jint
 10 Java_com_panasonic_communicationtest_StateConfirmFragment_openSerialDevice( JNIEnv* env, jobject thiz, jstring devName )
 11 {
 12     const char* devName_id = (*env)->GetStringUTFChars(env, devName, NULL);
 13     if(jniEnv == NULL) {
 14         jniEnv = env;
 15     }
 16
 17     return openSerialDevice(devName_id);
 18 }
 19
 20 jint
 21 Java_com_panasonic_communicationtest_StateConfirmFragment_readSerialData( JNIEnv* env, jobject thiz )
 22 {
 23     long dataTest = 0;
 24
 25     if(jniEnv == NULL) {
 26         jniEnv = env;
 27     }
 28
 29     jclass class;
 30     jfieldID send_instruction_record;
 31     jfieldID receive_instruction_record;
 32     class = (*env)->GetObjectClass(env, thiz);
 33     if (class == NULL)
 34     {
 35         return -1;
 36     }
 37     send_instruction_record = (*env)->GetFieldID(env, class, "send_instruction_str", "Ljava/lang/String;");
 38     receive_instruction_record = (*env)->GetFieldID(env, class, "receive_instruction_str", "Ljava/lang/String;");
 39     if (send_instruction_record == NULL || receive_instruction_record == NULL)
 40     {
 41         return -1;
 42     }
 43
 44     unsigned char* rcmdReq = malloc(9*sizeof(jchar));
 45     unsigned char* rcmdRes = malloc(10*sizeof(jchar));
 46
 47     if(readSerialData(1, 1, 80, &dataTest, 500, rcmdReq, rcmdRes) == 0){
 48
 49         unsigned char* str1 = "hello fan sen!";
 50         unsigned char* str2 = rcmdReq;
 51
 52         jstring jstr1 = (*env)->NewStringUTF(env, str1);
 53            jstring jstr2 = (*env)->NewStringUTF(env, str2);
 54         __android_log_print(ANDROID_LOG_INFO, "ComTest", rcmdReq);
 55            if(jstr1 == NULL || jstr2 == NULL){
 56                return 2;
 57            }
 58            (*env)->SetObjectField(env, thiz, send_instruction_record, jstr1);
 59            (*env)->SetObjectField(env, thiz, receive_instruction_record, jstr2);
 60
 61         return dataTest;
 62     }
 63
 64     return -1;
 65 }
 66
 67 jint
 68 Java_com_panasonic_communicationtest_StateConfirmFragment_closeSerialDevice( JNIEnv* env, jobject thiz, jint devFd )
 69 {
 70     if(jniEnv == NULL) {
 71         jniEnv = env;
 72     }
 73
 74     return closeSerialDevice(devFd);
 75 }
 76
 77 //  ===========================================
 78 jint
 79 Java_com_panasonic_communicationtest_ParameterSettingFragment_openSerialDevice( JNIEnv* env, jobject thiz, jstring devName )
 80 {
 81     const char* devName_id = (*env)->GetStringUTFChars(env, devName, NULL);
 82     if(jniEnv == NULL) {
 83         jniEnv = env;
 84     }
 85
 86     return openSerialDevice(devName_id);
 87 }
 88
 89 jint
 90 Java_com_panasonic_communicationtest_ParameterSettingFragment_readSerialData( JNIEnv* env, jobject thiz, jint devFd, jchar unitno, jshort addr, jlong data )
 91 {
 92     if(jniEnv == NULL) {
 93         jniEnv = env;
 94     }
 95
 96     unsigned char rcmdReq[10];
 97     unsigned char rcmdRes[10];
 98
 99     return readSerialData(devFd, unitno, addr, data, 500, rcmdReq[10], rcmdRes[10]);
100 }
101
102 jint
103 Java_com_panasonic_communicationtest_ParameterSettingFragment_writeSerialData( JNIEnv* env, jobject thiz, jint devFd, jchar unitno, jshort addr, jlong data )
104 {
105     if(jniEnv == NULL) {
106         jniEnv = env;
107     }
108
109     unsigned char rcmdReq[10];
110     unsigned char rcmdRes[10];
111
112     return writeSerialData(devFd, unitno, addr, data, 500, rcmdReq[10], rcmdRes[10]);
113 }
114
115 jint
116 Java_com_panasonic_communicationtest_ParameterSettingFragment_closeSerialDevice( JNIEnv* env, jobject thiz, jint devFd )
117 {
118     if(jniEnv == NULL) {
119         jniEnv = env;
120     }
121
122     return closeSerialDevice(devFd);
123 }
124
125
126
127 //--------------------------------------
128 jstring
129 Java_com_panasonic_communicationtest_StateConfirmFragment_getStringFromJNI( JNIEnv* env, jobject thiz, jstring address )
130 {
131     const char* address_id = (*env)->GetStringUTFChars(env, address, NULL);
132     if(jniEnv == NULL) {
133         jniEnv = env;
134     }
135
136 //    return getString(address_id);
137     return (*env)->NewStringUTF(env, address_id);
138 }
139
140 jstring
141 Java_com_panasonic_communicationtest_ParameterSettingFragment_getStringFromJNI( JNIEnv* env, jobject thiz, jstring address )
142 {
143     const char* address_id = (*env)->GetStringUTFChars(env, address, NULL);
144     if(jniEnv == NULL) {
145         jniEnv = env;
146     }
147     return getString(address_id);
148 }
149
150 jstring
151 Java_com_panasonic_communicationtest_ParameterSettingFragment_setStringIntoJNI( JNIEnv* env, jobject thiz, jstring address )
152 {
153     const char* address_id = (*env)->GetStringUTFChars(env, address, NULL);
154     if(jniEnv == NULL) {
155         jniEnv = env;
156     }
157     return setString(address_id);
158 }

JNI C代码

 1 extern long readSerialData(long devFd, unsigned char unitno, unsigned short addr, long *data, long timeout, unsigned char* rcmdReq, unsigned char* rcmdRes)
 2 {
 3     /*
 4      * Test by fansen
 5      */
 6
 7     *data = 1;
 8     int m = 0;
 9     int n = 0;
10     unsigned char test[10] = "0123456789";    //{0xff,0x1f,0x07,0x08};
11     strcpy(rcmdReq, test);
12
13 //    rcmdReq = test;
14 //    for(m = 0; m <= 8; m++){
15 //        rcmdReq[m] = test[m];
16 //        LOGI("test1: %c", test[m]);
17 //    }
18
19     LOGI(rcmdReq);
20
21
22 //    char test2[10] = {0xff,0x1f,0x07,0x08,0x00,0x87,0x00,0x01};
23 //    __android_log_print(ANDROID_LOG_INFO, "ComTest", "Communication Test 2");
24 //    for(n = 0; n <= 9; n++){
25 //        rcmdReq[n] = test2[n];
26 //    }
27
28     return OK;
29
30     /*
31      * Test over
32      */
时间: 2024-10-12 16:30:17

JNI 从C文件向Java文件传递多个参数的相关文章

在Eclipse中设置进行JNI的头文件编译方法(转 http://blog.csdn.net/mirkerson/article/details/17187109)

这两天在搞NDK开发,JNI的头文件进行编译的时候,要跑到对应的class文件路径下(通常是工程的bin目录),进行编译生成,很是不便,也容易出错,所以考虑在Eclipse中作为外部工具引入,所以便查了下资料,现记录下来. 方法是: 1.在Eclipse环境下,打开下图中的最右边那个按钮. 2.新建一个Program,写上名字比如“javaH”,然后填写下面几项内容: 2.1.Location:把JDK下面的javaH.exe的全路径填进来. 2.2.Working Directory: Jav

ndk学习18: JNI之C&C++调用Java

一.Java反射机制 先了解Java反射机制原理 例子网上很多,反射很灵活 二. 在JNI层调Java 用途: Java层逆向比较容易,增加逆向门槛,把调用都写到JNI层,  让Java层无调用关系 注意: C和C++有所不同,这里使用C++作为例子 1. 首先在代码中提供一个ShowLog函数 private void ShowMsg() { Log.d("_BING_", "ShowMsg"); } 2. 在上次的Add例子加入代码 JNIEXPORT jint

jni.h头文件详解(二)

一:struct JNINativeInterface_{} 结构体的作用:它有点像我们char字符驱动的 file_ops结构体,它定义各种函数对在(jni.h头文件详解一)中定义的各种数据的操作函数集体. 二:它包含那些针对Java中类和对象的相关操作呢如下图. 三:下面我们讲详细介绍14个部分方法的用法和解析 3.1.版本信息操作函数. 一.GetVersion jint (JNICALL *GetVersion)(JNIEnv *env) --模块信息:该模块主要针对的JNI接口的版本信

jni.h头文件学习笔记

Now :2015年 6月 8日 星期一 22时17分05秒 CST Note: 这篇笔记是我半年前写的,当时因为某些原因经常需要写jni方面的代码,所以就深入学习了下jni方面的知识,现在再来看之前写的东西,一句话概括就是深度不够,废话太多.因为这是一个不全的笔记(还有一部分想写的内容未能写上),所以当初想分享给其他同事的也不好意思分享. #-------------Add Now-------------# jni是java native interface的简写,是java和c/c++通信

jni.h头文件详解二

作者:左少华 博客:http://blog.csdn.net/shaohuazuo/article/details/42932813 转载请注明出处:http://blog.csdn.net/shaohuazuo 一:struct JNINativeInterface_{} 结构体的作用:它有点像我们char字符驱动的 file_ops结构体,它定义各种函数对在(jni.h头文件详解一)中定义的各种数据的操作函数集体. 二:它包含那些针对Java中类和对象的相关操作呢如下图. 三:下面我们讲详细

JNI——结构体(即java中的类)的传入与设置——NativeMethod映射表

参考:http://www.cnblogs.com/skywang12345/archive/2013/05/26/3093593.html java 类: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 package com.skywang.ndk; public class MyInfo {     private String  mName;                        

Android jni aes加解密,实现文件的加解密,具体实现可以自行修改,上面的代码为简单介绍,下面的是JNI端实现文件加解密,可以修改为字符串加解密

#include "aes.h" #include "modes.h" #include "e_os2.h" #include "aes_locl.h" #include "opensslconf.h" AES_KEY aes; //aes cbc模式加解密用到的向量 unsigned char iv[AES_BLOCK_SIZE]; for (i = 0; i < AES_BLOCK_SIZE; i

Atitit,通过pid获取进程文件路径&#160;java&#160;php&#160;&#160;c#.net版本大总结

Atitit,通过pid获取进程文件路径 java php  c#.net版本大总结 1. 通过PID获取进程路径的几种方法2 1.1. GetModuleFileNameEx 想获得进程可执行文件的路径最常用的方法是通过GetModuleFileNameEx函数获得可执行文件的模块路径这个函数从Windows NT 4.0开始到现在的Vista系统都能使用,向后兼容性比较好.2 1.2. 第二种方法是GetProcessImageFileName函数,这个函数在Windows XP及其以后的系

atitit. web 在线文件管理器最佳实践(1)--- elFinder 的使用流程解决之道 。打开浏览服务器文件夹java .net php

atitit. web 在线文件管理器最佳实践(1)--- elFinder 的使用流程解决之道 .打开浏览服务器文件夹java .net php 1. 环境:::项目java web,需要打开浏览服务器文件夹挑选文件,在返回... 1 2. 在线文件管理器要实现的基本的功能::指定开始目录,指定getfile回调 1 3. 组件选型:: elFinder (3M) ,,php web ftp 1 4. elFinder 的概念 1 5. elFinder  1.x 的使用过程 2 6. elF