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