JNI Java的基本调用

接口的作用无非就是取值、传参、方法调用之类的东西。

Android studio默认的native项目就是调用JNI的方法。

在JNI中怎么调用java类的属性,方法;以下为基本示例:

public class MainActivity extends AppCompatActivity {

    public int javaNum=3;
    // Used to load the 'native-lib' library on application startup.
    static {
        System.loadLibrary("native-lib");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Example of a call to a native method
        TextView tv = findViewById(R.id.sample_text);
        tv.setText(stringFromJNI());
        Log.d("TAG", "JNI_log onCreate: ...."+javaNum);
    }

    public void javaMethod(String log){
        Log.d("TAG", "javaMethod call:...... "+log);
    }

    /**
     * A native method that is implemented by the 'native-lib' native library,
     * which is packaged with this application.
     */
    public native String stringFromJNI();
}

cplusplus:

#include <jni.h>
#include <string>
#include<android/log.h>

#define TAG "JNI_log" // 这个是自定义的LOG的标识
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG ,__VA_ARGS__) // 定义LOGD类型

//jni 调用获取/赋值java属性(变量)
int getAndSetField(JNIEnv *env,
         jobject thiz/* this */) {
    //1.获取
    jclass clz = env->GetObjectClass(thiz);
    //2.获取属性id
    jfieldID myNum = env->GetFieldID(clz, "javaNum", "I");
    LOGD("获取属性id jfieldID = %d", myNum);
    //3.取值 ps:如果属性域是静态的,那么使用方法GetStaticFieldID, GetStaticObjectField
    int value = env->GetIntField(thiz, myNum);
    LOGD("获取属性值 value = %d", value);
    //4.改值
    env->SetIntField(thiz, myNum, 6);

    env->DeleteLocalRef(clz);
    return 1;
}

//jni 访问java方法
void callJavaMethod(JNIEnv *env,jobject thiz/* this */){
    jclass clz = env->GetObjectClass(thiz);

    //1.获取方法属性id
    jmethodID javaMethod = env->GetMethodID(clz, "javaMethod","(Ljava/lang/String;)V");
    //2.调用方法,传递参数
    const char *msg = "from native";
    jstring  jmsg = env->NewStringUTF(msg);
    env->CallVoidMethod(thiz,javaMethod,jmsg);

    env->DeleteLocalRef(clz);
}


void test(JNIEnv *env,jobject thiz){
    getAndSetField(env, thiz);
    callJavaMethod(env,thiz);
}

extern "C" JNIEXPORT jstring JNICALL
Java_com_example_myapplication_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject thiz /* this */) {
    std::string hello = "Hello from C++";
    test(env, thiz);
    return env->NewStringUTF(hello.c_str());
}

附个比较全的用法示例:JNI 常见用法 - 简书

上一篇:go get安装包超时处理


下一篇:Python123练习第五章