jni编程中C++/C语言一些问题
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,。。);