native学习六(JNI访问java类方法)

7 篇文章 0 订阅

1、Animal.java

package com.example.demo;

import com.example.demo.utils.Logger;

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

    public final static String TAG = "Animal";

    protected String name;

    public static int num = 0;

    public Animal(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public static int getNum() {
        return num;
    }

    public static void setNum(int num) {
        Animal.num = num;
    }

    //c++调用java的实例方法
    public void callInstanceMethod(int num) {
        Logger.d(TAG, "call instance method and num is " + num);
    }

    //c++调用java的静态方法
    public static String callStaticMethod(String str) {
        if (str != null) {
            Logger.d(TAG, "call static method with " + str);
        } else {
            Logger.d(TAG, "call static method str is null");
        }
        return "";
    }

    public static String callStaticMethod(String[] strs, int num) {
        if (strs != null) {
            for (String str : strs) {
                Logger.d(TAG, "str in array is " + str);
            }
        }
        return "";
    }
}

2、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 jniAccessField = JNIAccessField()
        val animal = Animal("animal")
        sample_text.setOnClickListener {

            //JNI调用java实例的方法
            jniAccessField.accessInstanceMethod(animal)

            //JNI调用java静态的方法
            jniAccessField.accessStaicMethod1(animal)

            jniAccessField.accessStaicMethod2(animal)
}

 }
}

3、JNIAccessField.java

package com.example.demo.jni;

import com.example.demo.Animal;

/**
 * author : huangyi
 * date   : 2020/2/10
 * desc   :
 */
public class JNIAccessField {
    static {
        System.loadLibrary("accessfield-lib");
    }

    public native void accessInstanceMethod(Animal animal);

    public native void accessStaicMethod1(Animal animal);

    public native void accessStaicMethod2(Animal animal);
}

4、jni_accessfield.cpp

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

#include <base.h>

/**
 * |Java                       |JNI
 * |String fun();              |()Ljava/lang/String;
 * |long f(int i, Class c);    |(ILjava/lang/Class;)J
 * |String(byte[] bytes);      |([B)V
 */

//c++调用java的实例方法
extern "C" JNIEXPORT void JNICALL
Java_com_example_demo_jni_JNIAccessField_accessInstanceMethod(JNIEnv *env, jobject instance,
                                                          jobject animal) {
    jclass cls = env->GetObjectClass(animal);
    jmethodID mid = env->GetMethodID(cls, "callInstanceMethod", "(I)V");
    env->CallVoidMethod(animal, mid, 9);
}

//c++调用java的静态方法
extern "C" JNIEXPORT void JNICALL
Java_com_example_demo_jni_JNIAccessField_accessStaicMethod1(JNIEnv *env, jobject instance,
                                                       jobject animal) {
    jclass cls = env->GetObjectClass(animal);
    jmethodID mid = env->GetStaticMethodID(cls, "callStaticMethod",
                                           "(Ljava/lang/String;)Ljava/lang/String;");

    jstring str = env->NewStringUTF("jstring");
    env->CallStaticObjectMethod(cls, mid, str);
}

extern "C" JNIEXPORT void JNICALL
Java_com_example_demo_jni_JNIAccessField_accessStaicMethod2(JNIEnv *env, jobject instance,
                                                       jobject animal) {
    jclass cls = env->GetObjectClass(animal);
    jmethodID mid = env->GetStaticMethodID(cls, "callStaticMethod",
                                           "([Ljava/lang/String;I)Ljava/lang/String;");

    jclass strClass = env->FindClass("java/lang/String");
    int size = 2;
    jobjectArray strArray = env->NewObjectArray(size, strClass, nullptr);
    jstring strItem;
    for (int i = 0; i < size; ++i) {
        strItem = env->NewStringUTF("string in native");
        env->SetObjectArrayElement(strArray, i, strItem);
    }

    env->CallStaticObjectMethod(cls, mid, strArray, size);
}

 

运行结果:

2020-02-17 02:45:21.302 2173-2173/com.example.demo D/Animal: [Animal; callInstanceMethod; 40; ThreadName:main; ThreadId:2]: call instance method and num is 9
2020-02-17 02:45:21.302 2173-2173/com.example.demo D/Animal: [Animal; callStaticMethod; 46; ThreadName:main; ThreadId:2]: call static method with jstring
2020-02-17 02:45:21.303 2173-2173/com.example.demo D/Animal: [Animal; callStaticMethod; 56; ThreadName:main; ThreadId:2]: str in array is string in native
2020-02-17 02:45:21.303 2173-2173/com.example.demo D/Animal: [Animal; callStaticMethod; 56; ThreadName:main; ThreadId:2]: str in array is string in native

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值