native学习四(JNI中引用类型转换)

7 篇文章 0 订阅

1、MainActivity.kt

class MainActivity : AppCompatActivity() {

    private val TAG = "MainActivity"

    var strings = arrayOf("apple", "pear", "banana")

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

val jniReference = JNIReferenceType()
        sample_text.setOnClickListener {
            sample_text.text = jniReference.callNativeStringArray(strings);
        }

  }
}

2、JNIReferenceType.kt

package com.example.demo.jni

/**
 *    author : huangyi
 *    date   : 2020/2/10
 *    desc   :
 */
class JNIReferenceType {

    external fun callNativeStringArray(strArray: Array<String>): String

    companion object {

        init {
            System.loadLibrary("referenceType-lib")
        }
    }

}

3、jni_reference_type.cpp

//
// Created by huangyi on 2020/2/10.
//

#include <base.h>

/**
 * |Java      |Native
 * |boolean   |jboolean
 * |byte      |jbyte
 * |char      |jchar
 * |short     |jshort
 * |int       |jint
 * |long      |jlong
 * |float     |jfloat
 * |double    |jdouble
 */

/**
 * |Java Reference   |Native             |Java Reference  |Native
 * |All objets       |jobject            |char[]          |jcharArray
 * |java.lang.Class  |jclass             |short[]         |jshortArray
 * |java.lang.String |jstring            |int[]           |jintArray
 * |Object[]         |jobjectArray       |long[]          |jlongArray
 * |boolean[]        |jbooleanArray      |float[]         |jfloatArray
 * |byte[]           |jbyteArray         |double[]        |jdoubleArray
 * |java.lang.Throwable |jthrowable
 */

extern "C" JNIEXPORT jstring JNICALL
Java_com_example_demo_jni_JNIReferenceType_callNativeStringArray(JNIEnv *env, jobject thiz,
                                                             jobjectArray str_array) {
    int len = env->GetArrayLength(str_array);
    LOGD("len is %d", len);

    //拿到对象数组的首元素
    jstring firstStr = static_cast<jstring>(env->GetObjectArrayElement(str_array, JNI_FALSE));
    const char *str = env->GetStringUTFChars(firstStr, JNI_FALSE);
    LOGD("first string is %s", str);
    env->ReleaseStringUTFChars(firstStr, str);

    return env->NewStringUTF(str);

}

运行结果:

2020-02-17 01:54:19.787 330-330/com.example.demo D/HUANGYI: len is 3
2020-02-17 01:54:19.787 330-330/com.example.demo D/HUANGYI: first string is apple

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值