jni编程中C++/C语言一些问题

文章链接:http://www.liuschen.com

1.uint8_t

首先,先来看一下jni.h关于j数据类型的定义:

#ifdef HAVE_INTTYPES_H
# include <inttypes.h>      /* C99 */
typedef uint8_t         jboolean;       /* unsigned 8 bits */
typedef int8_t          jbyte;          /* signed 8 bits */
typedef uint16_t        jchar;          /* unsigned 16 bits */
typedef int16_t         jshort;         /* signed 16 bits */
typedef int32_t         jint;           /* signed 32 bits */
typedef int64_t         jlong;          /* signed 64 bits */
typedef float           jfloat;         /* 32-bit IEEE 754 */
typedef double          jdouble;        /* 64-bit IEEE 754 */
#else
typedef unsigned char   jboolean;       /* unsigned 8 bits */
typedef signed char     jbyte;          /* signed 8 bits */
typedef unsigned short  jchar;          /* unsigned 16 bits */
typedef short           jshort;         /* signed 16 bits */
typedef int             jint;           /* signed 32 bits */
typedef long long       jlong;          /* signed 64 bits */
typedef float           jfloat;         /* 32-bit IEEE 754 */
typedef double          jdouble;        /* 64-bit IEEE 754 */
#endif

而在inttypes.h中又有如下定义,当然不同环境可能定义略有不同

#if defined(_CHAR_IS_SIGNED)  
typedef char                    int8_t;  
#else  
#if defined(__STDC__)  
typedef signed char             int8_t;  
#endif  
#endif  
typedef short                   int16_t;  
typedef int                     int32_t;  
#ifdef  _LP64  
#define _INT64_TYPE  
typedef long                    int64_t;  
#else   /* _ILP32 */  
#if defined(_LONGLONG_TYPE)  
#define _INT64_TYPE  
typedef long long               int64_t;  
#endif  
#endif  
  
typedef unsigned char           uint8_t;  
typedef unsigned short          uint16_t;  
typedef unsigned int            uint32_t;  
#ifdef  _LP64  
typedef unsigned long           uint64_t;  
#else   /* _ILP32 */  
#if defined(_LONGLONG_TYPE)  
typedef unsigned long long      uint64_t;

如uint8_t是unsigned char的别名,能直观的体现所表示类型的字节数,以及符号属性,在不同的环境即是所表示的数据类型不同,但是只要在inttypes.h中将这种差异处理了,程序通过调用uint8_t并不会有什么影响,因为它只表示无符号一字节的数据,方便了程序不同平台的移植。在做音视频传输时,帧的数据就是通过uint8_t数组来存储的。

2.env

注意:jni.h头文件中对于**.c & **.cpp采用不同的定义
在C的定义中,env是一个两级指针,而在C++的定义中,env是个一级指针
C形式需要对env指针进行双重deferencing,而且须将env作为第一个参数传给jni函数,如进行字符串转化时:

C++:env0->GetStringUTFChars(url, NULL)
C:(*env)->GetStringUTFChars(env,url, NULL)

3.类型转换

C++ char const* 类型和字符串互相转化

#include<iostream>
std::string src1(rootpath);
std::string src2(streamName0);
std::string dest = src1 + src2;
char const* streamName = dest.c_str();

4.C++将uint_t数组输出到文件

头文件

#include <iostream>
#include <fstream>
using namespace std;//这个必须加

输出

ofstream outfile;
outfile.open(store_path);
for(i=0;i<size;i++){
	outfile<<fReceiveBuffer[i];
}
outfile.close();

5.C++调用Java

通过路径找到要调用的java方法所在类

jclass dpclazz = (env)->FindClass(“com/JavaJNI”);

寻找class里面的方法,javap -p -s 获取 ()V

jmethodID method1 = (env)->GetMethodID(dpclazz,”调用方法”,”()V”);

obj1是java对象实例,method1为方法,再后面方法为参数

(env)->CallVoidMethod(obj1,method1,。。);

Loading Disqus comments...
Table of Contents