jbooleanArray作为传参时
package com.example.administrator.mynative;
public class nativeClass {
static{
System.loadLibrary("untitled_armeabi-v7a");
}
public static native boolean[] readJNI(boolean[] c_boolean);
}
c++ .h文件代码
#ifndef UNTITLED_H
#define UNTITLED_H
#include "untitled_global.h"
#ifdef Q_OS_ANDROID
#include <jni.h>
#endif
class UNTITLED_EXPORT Untitled
{
public:
Untitled();
};
#ifdef Q_OS_ANDROID
#ifdef __cplusplus
extern "C"
{
JNIEXPORT jbooleanArray JNICALL Java_com_example_administrator_mynative_nativeClass_readJNI(JNIEnv *env,jobject, jbooleanArray c_boolean);
#ifdef __cplusplus
}
#endif
#endif
#endif
#endif // UNTITLED_H
c++ .cpp文件
#include "untitled.h"
Untitled::Untitled()
{
}
#ifdef Q_OS_ANDROID
jbooleanArray Java_com_example_administrator_mynative_nativeClass_readJNI(JNIEnv *env, jobject, jbooleanArray c_boolean)
{
//取Boolean数据值
jsize bool_size = env->GetArrayLength(c_boole);
jboolean *j_boolean = env->GetBooleanArrayElements(c_boole, 0);
bool midiNotes[3] = {false};
std::copy(j_boolean, j_boolean + bool_size, midiNotes);
/*
//或者使用这种方式取Boolean数据值
unsigned char d[3] = {false,false,false};
jsize bool_size = env->GetArrayLength(area_is_exist);
jboolean *j_boolean = env->GetBooleanArrayElements(area_is_exist, 0);
for (int i = 0; i < bool_size; ++i) {
d[i] = j_boolean[i];
bool b1 = j_boolean[i];
jboolean b2 = j_boolean[i];
}
*/
//回收
env->ReleaseBooleanArrayElements(c_boole, j_boolean, 0);
//将 c++的bool数组返回给java
unsigned char c_bool[3] = {false,true,true};
jboolean *x;
x = c_bool;
jbooleanArray boolean_array;
boolean_array = env->NewBooleanArray(3);
env->SetBooleanArrayRegion(boolean_array,0,3,x);
return boolean_array;
}
#endif
字符串数组作为传参时
Java代码
package com.example.administrator.mynative;
public class nativeClass {
static{
System.loadLibrary("untitled_armeabi-v7a");
}
public static native String[] readJNI(String c_s);
}
c++ .h文件代码
#ifndef UNTITLED_H
#define UNTITLED_H
#include "untitled_global.h"
#ifdef Q_OS_ANDROID
#include <jni.h>
#endif
class UNTITLED_EXPORT Untitled
{
public:
Untitled();
};
#ifdef Q_OS_ANDROID
#ifdef __cplusplus
extern "C"
{
//字符串转jstring
jstring str2jstring(JNIEnv* env, const char * pat);
//jstring转字符串
std::string jstring2str(JNIEnv* env, jstring jstr);
JNIEXPORT jobjectArray JNICALL Java_com_example_administrator_mynative_nativeClass_readJNI(JNIEnv *env, jobject, jobjectjstring c_s);
#ifdef __cplusplus
}
#endif
#endif
#endif
#endif // UNTITLED_H
c++ .cpp文件
#include "untitled.h"
#include <QByteArray>
#include <QString>
#include <QDebug>
Untitled::Untitled()
{
}
#ifdef Q_OS_ANDROID
jstring str2jstring(JNIEnv* env, const char * pat)//字符串转jstring
{
//定义java String类 strClass
jclass strClass = (env)->FindClass( "Ljava/lang/String;" );
//获取String(byte[],String)的构造器,用于将本地byte[]数组转换为一个新String
jmethodID ctorID = (env)->GetMethodID(strClass, "<init>" , "([BLjava/lang/String;)V" );
//建立byte数组
jbyteArray bytes = (env)->NewByteArray(strlen(pat));
//将char* 转换为byte数组
(env)->SetByteArrayRegion(bytes, 0 , strlen(pat), (jbyte*)pat);
// 设置String, 保存语言类型,用于byte数组转换至String时的参数
jstring encoding = (env)->NewStringUTF( "GB2312" );
//将byte数组转换为java String,并输出
return (jstring)(env)->NewObject(strClass, ctorID, bytes, encoding);
}
std::string jstring2str(JNIEnv* env, jstring jstr)//jstring转字符串
{
char * rtn = NULL;
jclass clsstring = env->FindClass( "java/lang/String" );
jstring strencode = env->NewStringUTF( "GB2312" );
jmethodID mid = env->GetMethodID(clsstring, "getBytes" , "(Ljava/lang/String;)[B" );
jbyteArray barr= (jbyteArray)env->CallObjectMethod(jstr,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 );
std::string stemp(rtn);
free(rtn);
return stemp;
}
jobjectArray Java_com_example_administrator_mynative_nativeClass_readJNI(JNIEnv *env, jobject, jstring c_s)
{
//取jstring值
//此函数不可传空字符串 如"" 会崩溃 可改用std::string c_string = env->GetStringUTFChars(c_s, 0);这个比较好用
//使用env->NewStringUTF()转jstring值时 内容为乱码时 会崩溃 可改调用 str2jstring()函数
//QT 则使用QAndroidJniObject str = c_s;QString c_string= str.toString()
std::string c_string = jstring2str(env,c_s);
char* ch[3];
QString str[3] = {"hello","word",c_string.c_str()};
QByteArray ba = str[0].toLatin1(); // must
ch[0]=ba.data();
QByteArray ba1 = str[1].toLatin1(); // must
ch[1]=ba1.data();
QByteArray ba2 = str[2].toLatin1(); // must
ch[2]=ba2.data();
jobjectArray ret;
int i;
ret= (jobjectArray)env->NewObjectArray(3,env->FindClass("java/lang/String"),env->NewStringUTF(""));
for(i=0;i<3;i++) env->SetObjectArrayElement(ret,i,env->NewStringUTF(ch[i]));
return ret;
}
#endif
jintArray作为传参时
Java代码
package com.example.administrator.mynative;
public class nativeClass {
static{
System.loadLibrary("untitled_armeabi-v7a");
}
public static native int[] readJNI();
}
c++ .h文件代码
#ifndef UNTITLED_H
#define UNTITLED_H
#include "untitled_global.h"
#ifdef Q_OS_ANDROID
#include <jni.h>
#endif
class UNTITLED_EXPORT Untitled
{
public:
Untitled();
};
#ifdef Q_OS_ANDROID
#ifdef __cplusplus
extern "C"
{
JNIEXPORT jintArray JNICALL Java_com_example_administrator_mynative_nativeClass_readJNI(JNIEnv *env ,jobject);
#ifdef __cplusplus
}
#endif
#endif
#endif
#endif // UNTITLED_H
c++ .cpp文件
#include "untitled.h"
Untitled::Untitled()
{
}
#ifdef Q_OS_ANDROID
jintArray Java_com_example_administrator_mynative_nativeClass_readJNI(JNIEnv *env, jobject)
{
//将 c++的int数组返回给java
int c_int[3] = {0,1,100};
jintArray j_int = env->NewIntArray(3);
env->SetIntArrayRegion(j_int, 0, 3, c_int);
return j_int;
}
#endif