1. C++返回数组类型:
//返回float[],其他基本数据类型数组类似
JNIEXPORT
jfloatArray JNICALL
Java_com_miles_Test_RetFloatArray(JNIEnv *env, jclass)
{
jfloatArray positionArray = env->NewFloatArray(2);
if (positionArray == NULL){
return NULL;
}
jfloat tempArray[2];
tempArray[0] = (jfloat)(get2DPalmPosition.x);
tempArray[1] = (jfloat)(get2DPalmPosition.y);
//把获取到的值赋给positionArray
env->SetFloatArrayRegion(positionArray, 0, 2, tempArray);
//返回把获取到的值赋给positionArray
return positionArray;
}
2. 字符串的转换
void testString(JNIEnv *env,jstring jstr)
{
1.JNI中把java的字符串转换成c的字符串:
char *str = env->GetStringUTFChars(jstr,0);
2. c的字符串转换成java的字符串
char* cstr = "hello from c";
jstring jstr = env->NewStringUTF(env, cstr);
}
3. 传参为数组
JNIEXPORT void
Java_com_miles_Test_canShuArr(JNIEnv *env, jobject object, jbyteArray yuvdata) {
//1.获取数组指针
jbyte *bBuffer = env->GetByteArrayElements(yuvdata, 0);
//2.转换成uchar类型
unsigned char *buf = (unsigned char *) bBuffer;
//3.本地对buf进行操作
//XXX
//4.最后释放资源
env->ReleaseByteArrayElements(yuvdata, bBuffer, JNI_ABORT);
}
4. 传递的参数是java对象
当java创建的对象需要本地来填充值时。
单个对象:
java类:
package com.miles;
import android.content.pm.ActivityInfo;
import com.usens.fingoservice.BuildConfig;
public class Config {
private int mWidth = 640;
private int mHeight = 480;
public Config() { }
// called from JNI
public void jniSetWidth(int width) {
mWidth = width;
}
public void jniSetHeight(int height) {
mHeight = height;
}
public String jniGetId() {
return "1";
}
}
C++:
jclass config_class = NULL;
jmethodID jniSetWidth;
jmethodID jniSetHeight;
jmethodID jniGetId;
JNIEXPORT void
Java_com_miles_Test_getConfigJni(JNIEnv *env, jobject, jobject config) {
if (NULL == config_class) {
config_class = env->FindClass("com/usens/Config");
config_class = static_cast<jclass>(env->NewGlobalRef((jobject) config_class));
jniSetWidth = env->GetMethodID(config_class, "jniSetWidth", "(I)V");
jniSetHeight = env->GetMethodID(config_class, "jniSetHeight", "(I)V");
jniGetId= env->GetMethodID(config_class, "jniGetId", "()Ljava/lang/String;");
}
env->CallVoidMethod(config, jniSetWidth, 640);
env->CallVoidMethod(config, jniSetHeight, 480);
jstring _cameraid = (jstring)(env->CallObjectMethod(config, jniGetId));
}
调用:
private Config mConfig = null;
public Config getConfig() {
if (null == mConfig) {
mConfig = new Config();
getConfigJni(mConfig);
}
return mConfig;
}
对象数组
java代码同上
C++:
jclass config_class = NULL;
jmethodID jniSetWidth;
jmethodID jniSetHeight;
jmethodID jniGetId;
JNIEXPORT void
Java_com_miles_Test_getConfigJni(JNIEnv *env, jobject, jobjectArray configs) {
jsize nconfigs = env->GetArrayLength(configs);
if (NULL == config_class) {
config_class = env->FindClass("com/usens/Config");
config_class = static_cast<jclass>(env->NewGlobalRef((jobject) config_class));
jniSetWidth = env->GetMethodID(config_class, "jniSetWidth", "(I)V");
jniSetHeight = env->GetMethodID(config_class, "jniSetHeight", "(I)V");
jniGetId= env->GetMethodID(config_class, "jniGetId", "()Ljava/lang/String;");
}
for(int i = 0;i< nconfigs ;i++){
//根据i,遍历每一个对象
jobject handInfo = env->GetObjectArrayElement(handInfos, i);
//调用对应对象的方法
env->CallVoidMethod(handInfo, jniSetWidth, 640);
env->CallVoidMethod(handInfo, jniSetHeight, 480);
jstring _cameraid = (jstring)(env->CallObjectMethod(handInfo, jniGetId));
}
}
调用:
public Config[] getConfig (int nConfigs) {
Config[] result = new Config[nConfigs];
for (int i = 0; i < nConfigs; i ++) {
result[i] = new Config();
}
if (!getConfigJni(result))
return null;
return result;
}