jni接口部分语法

1.c++函数的命名


命名规则为:返回值 Java_包路径_类名_函数名(JNIEnv* env,jobject obj);对应如下:
jint Java_com_ndk_testndk_TestHello_jnia(JNIEnv* env,jobject obj);

其中第二个参数为该类的对象。env就是初始化虚拟机得到的JNI环境


2.获取指定对象的类定义(jclass)


已知类名的情况下使用FindClass来查找对应的类,构建一个Class
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是一个能够存放任意类型的动态数组,能够增加和压缩数据。


已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页