在C++中得到一系列圆并返回ArrayList

/* DO NOT EDIT THIS FILE – it is machine generated */#include <jni.h>/* Header for class c_MyNative */#ifndef _Included_c_MyNative#define _Included_c_MyNative#ifdef __cplusplusextern "C" {#endif/* * Class:c_MyNative * Method: findCircles * Signature: (Ljava/lang/String;)Ljava/util/ArrayList; */JNIEXPORT jobject JNICALL Java_c_MyNative_findCircles (JNIEnv *, jclass, jstring);#ifdef __cplusplus}#endif#endif接着编写对应的findCircle.cpp

首先添加头文件

#include "c_MyNative.h"

接着自定义一个在C++中使用的Circle

//自定义圆类型struct Circle{int x;int y;int radius;Circle(){x = y = radius = 0;}Circle(int x1, int y1, int r1){x = x1;y = y1;radius = r1;}};我打算用vector存储所有的结果圆,所以需要//加入头文件#include <vector>//引入名空间using namespace std;//定义动态数组vector<Circle> circles;这里名空间之前忘记加了,因为是在cl编译器下编译,所以它总是在vector<Circle>这里提示缺少";"(在<前面)。

所以名空间还是好重要的哦!!!!!!!!千万不能只加头文件呀!!

之后我们要实现函数

/** Class: c_MyNative* Method: findCircles* Signature: (Ljava/lang/String;)Ljava/util/ArrayList;*/JNIEXPORT jobject JNICALL Java_c_MyNative_findCircles (JNIEnv *env, jclass thiz, jstring imgUrl)

它的输入是个String,输出则是个ArrayList<Circle>

这个函数的实现步骤主要分为:

首先说一下几个基本的函数,

env->FindClass是找类句柄的函数,后边跟的是类的地址,比如java.lang.String,包之间是用’/’来分隔的哦

<span style="font-weight: normal;">jclass clsstring = env->FindClass("java/lang/String");</span>

env->GetMethodID获取类的方法,有3个参数,第一个是类句柄,第二个是方法名,第三个则是参数的签名

比如下面第一个"<init">是构造函数,"()V"中()里边的是输入参数,()后边的是返回值,,这里输入参数为空,返回void类型。

第二个add是ArrayList的方法,参数是object对象,返回值是boolean,即Z。

第三个getBytes是String的方法,输入是参数,输出是byte[]数组,所以是[B

<pre name="code" class="cpp"><span style="font-weight: normal;">jmethodID construct = env->GetMethodID(cls_ArrayList,"<init>","()V"); jmethodID arrayList_add = env->GetMethodID(cls_ArrayList,"add","(Ljava/lang/Object;)Z"); jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");</span>关于使用的参数签名方式有如下几种

jstring转换为C++中的char *

代码如下:

char* rtn = NULL;jclass clsstring = env->FindClass("java/lang/String");jstring strencode = env->NewStringUTF("utf-8");jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");jbyteArray barr= (jbyteArray)env->CallObjectMethod(imgUrl, mid, strencode);jsize alen = env->GetArrayLength(barr);jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);if (alen > 0){rtn = (char*)malloc(alen + 1);memcpy(rtn, ba, alen);rtn[alen] = 0;}env->ReleaseByteArrayElements(barr, ba, 0);接着创建一个ArrayList<Circle>

别想一下造出大海,必须先由小河川开始。

在C++中得到一系列圆并返回ArrayList

相关文章:

你感兴趣的文章:

标签云: