JNI Java调用 qt so库的参数传递例子(jbooleanArray jintArray 字符串数组)

  1. jbooleanArray作为传参时

  • Java代码
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
  1. 字符串数组作为传参时

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
  1. 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值