提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
JNI常见的几种类型传参
提示:以下是本篇文章正文内容,下面案例可供参考
一、int类型传参
java中的int和c++中的int类型一致,可以直接使用。
JNIEXPORT jint JNICALL Java_com_example_obo_OBOJNI_test_1jni_1api
(JNIEnv *env, jobject obj, jint j_a, jint j_b){
int a = (int)j_a;
int b = (int)j_b;
__android_log_print(ANDROID_LOG_ERROR, "TEST", "JNI a= %d b= %d",a,b);
return (jint)(a+b);
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
二、boolean类型传参
JNIEXPORT jboolean JNICALL Java_com_example_obo_OBOJNI_test_1jni_1api2
(JNIEnv *env, jobject obj, jboolean jbool){
bool arg_bool = (jbool == JNI_TRUE)? true: false;
__android_log_print(ANDROID_LOG_ERROR, "TEST", "JNI bool %s",
(arg_bool == true)? "true":"false");
return (arg_bool == true)? JNI_TRUE:JNI_FALSE;
}
三、String类型传参
JNIEXPORT jstring JNICALL Java_com_example_obo_OBOJNI_test_1jni_1api3
(JNIEnv *env, jobject obj, jstring str1, jstring str2)
{
//java中string类,所以不能直接转成C++方式
const char *c_str1 = NULL;
const char *c_str2 = NULL;
//如果填写false,则是直接指向存放字符的地址,如果填写ture,则重新拷贝复制一份。
c_str1 = env->GetStringUTFChars(str1, 0);
__android_log_print(ANDROID_LOG_ERROR, "TEST", "JNI string1 %s", c_str1);
//释放java传递过来的jstring里面的在堆上开辟的字符串空间
env->ReleaseStringUTFChars(str1, c_str1);
jboolean jb = JNI_FALSE;
c_str2 = env->GetStringUTFChars(str2, &jb);
__android_log_print(ANDROID_LOG_ERROR, "TEST", "JNI string2 %s", c_str2);
env->ReleaseStringUTFChars(str2, c_str2);
jstring ret = env->NewStringUTF("Jni return String");
return ret;
}
四、数组类型传参
JNIEXPORT void JNICALL Java_com_example_obo_OBOJNI_test_1jni_1api4
(JNIEnv *env, jobject obj, jintArray jarray)
{
//获取java中数组的首地址,填0是不拷贝
jint *pia = env->GetIntArrayElements(jarray, 0);
//得到数组长度
jsize array_len = env->GetArrayLength(jarray);
//使用 pia
for (int i = 0; i <array_len ; ++i) {
__android_log_print(ANDROID_LOG_ERROR, "TEST", "array[%d] %d", i, pia[i]);
}
//释放java中的数组,0为是否为拷贝
env->ReleaseIntArrayElements(jarray,pia,0);
}