1.c++函数的命名
jint Java_com_ndk_testndk_TestHello_jnia(JNIEnv* env,jobject obj);
其中第二个参数为该类的对象。env就是初始化虚拟机得到的JNI环境
2.获取指定对象的类定义(jclass)
jclass cls = (*env)->FindClass(env,"jni/test/Demo");//把点号换成斜杠
通过对象直接得到其所对应的类:
jclass cls = (*env)-> GetObjectClass(env, obj);//其中obj是要引用的对象,类型是jobject象直接得到其所对应的类
3.实例化一个对象:
jobject obj== (jclass)env->NewGlobalRef(cls);
返回全局引用。如果系统内存不足则返回 NULL.全局引用通过调用 DeleteGlobalRef() 来显式撤消。
调用AllocObject产生jclass类定义对应的类实例对象;这不会调用任何类的构造函数,仅仅是内存创建。
调用NewObject产生jclass类定义对应的类实例对象;这需要提供类的构造方法的MethodID,会调用指定的构造函数。
4.获取 java对象构造函数
构造函数作为特例,方法名字为 <init>,返回类型为 ()V。例子:
jmethodID mtdConstruct = pJni->GetMethodID(cls, "<init>", "()V");
5.实例化Java中的方法:
//静态 如果mid为0表示获取方法定义失败.下同
jmethodID mid1 = env->GetStaticMethodID(obj, "getStaticString","()Ljava/lang/String;");
//非静态
jmethodID mid2 = env->GetMethodID(obj, "getString","(Ljava/lang/String;)Ljava/lang/String;");
其中"()Ljava/lang/String;",括号是参数,Ljava/lang/String;是返回值.
如有参数string,即为"(Ljava/lang/String;)Ljava/lang/String;"
Java类型 对应的签名
boolean Z
byte B
char C
shrot S
int I
long L
float F
double D
void V
Object 以"L"开头,以";"结尾,中间是用"/" 隔开。比如:Ljava/lang/String;如果是嵌套类,则用$来表示嵌套。例如 "(Ljava/lang/String;Landroid/os/FileUtils$FileStatus;)Z"
Array 数组以"["开头,后面跟数组类型。如[Ljava/lang/String;就标识 String[], "[Ljava/lang/Object;"就是表示Object[]。
6.获取Java对象的属性
jfProvince = env->GetFieldID(obj, "province", "Ljava/lang/String;");
jfCityList = env->GetFieldID(obj, "cityList", "Ljava/util/List;");
jfMonitorId = env->GetFieldID(obj, "id", "I");
参数为:类的对象,类属性名称,类属性对应的类型。
7.调用Java中的方法
jfProvince = env->GetFieldID(obj, "province", "Ljava/lang/String;");
jfCityList = env->GetFieldID(obj, "cityList", "Ljava/util/List;");
jfMonitorId = env->GetFieldID(obj, "id", "I");
Call<Type>Method执行指定MethodID对应的类的方法,其中<Type>应替换为函数返回值类。如CallStaticIntMethod完成调用所有的返回值为Int的类的静态方法。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
附:c++中的一些语法
引用:
int m;
int &n = m;
n是m的一个引用,对n的任何操作就是对m的操作,n既不是m的拷贝,也不是指向m的指针,其实n就是m它自己。
-------------------------------------------------------------------------------------------------------------------------------------------------------------
对于一个结构来说,
struct MyStruct {
int member_a;
};
如果有个变量MyStruct s,那么使用其中的成员元素时可以用s.member_a = 1;
如果采用 指针方法访问,比如MyStruct * ps,那么同样的访问必须用 箭头号:ps->member_a = 1;
::只用在类成员函数和类成员变量中。如声明一个类:
class CA {
public:
int ca_var;
int add(int a, int b);
int add(int a);
};
那么在实现这个函数时,必须这样书写 类名::方法名:
int CA::add(int a, int b) { return a + b; }
-------------------------------------------------------------------------------------------------------------------------------------------------------------
vector
vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。