Android-JNI(5)-C語言調用Java函數

java定義方法和native方法

package com.example.ndkcallback;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class DataProvider {
    //C調用java空方法
    public void helloFromJava(){
        System.out.println("哈哈哈  我被調用了");
    }
    //C調用java中的帶兩個int參數的方法
    public int Add(int x,int y){
         int result=x+y;
        System.out.println("result:"+result);
        return result;
    }
    //C調用java中參數爲string的方法
    public void printString(String s){
        System.out.println(s);
    }

    public static void demo(){
        System.out.println("哈哈哈,我是靜態方法");

    }

    public native void callMethod1();
    public native void callMethod2();
    public native void callMethod3();
    public native void callMethod4();
    public native void callMethod5();
}

配置build和Androidl.mk, javah生成頭文件

c語言

#include "com_example_ndkcallback_DataProvider.h"


JNIEXPORT void JNICALL Java_com_example_ndkcallback_DataProvider_callMethod1
  (JNIEnv * env, jobject jobject){

    /*
     *
        Class<?> forName = Class.forName("com.example.ndkcallback.DataProvider");
        Method declaredMethod = forName.getDeclaredMethod("helloFromJava", new Class[]{});
        declaredMethod.invoke(forName.newInstance(), new Object[]{});
     *
     *
     */
    ///jclass      (*FindClass)(JNIEnv*, const char*);
    jclass clazz=(*env)->FindClass(env,"com/example/ndkcallback/DataProvider");
    //  jmethodID   (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
    // 方法簽名  參數和返回值
    jmethodID methodId=(*env)->GetMethodID(env,clazz,"helloFromJava","()V");
    // void        (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);
    (*env)->CallVoidMethod(env,jobject,methodId);
}

JNIEXPORT void JNICALL Java_com_example_ndkcallback_DataProvider_callMethod2
  (JNIEnv *  env, jobject jobject){
    jclass clazz=(*env)->FindClass(env,"com/example/ndkcallback/DataProvider");
    jmethodID methodId=(*env)->GetMethodID(env,clazz,"Add","(II)I");
    // jint        (*CallIntMethod)(JNIEnv*, jobject, jmethodID, ...);
    (*env)->CallIntMethod(env,jobject,methodId,3,5);
}

JNIEXPORT void JNICALL Java_com_example_ndkcallback_DataProvider_callMethod3
  (JNIEnv * env, jobject jobject){   // 參數 object  就是native方法所在的類
    jclass clazz=(*env)->FindClass(env,"com/example/ndkcallback/DataProvider");
        jmethodID methodId=(*env)->GetMethodID(env,clazz,"printString","(Ljava/lang/String;)V");
        // jint        (*CallIntMethod)(JNIEnv*, jobject, jmethodID, ...);
        jstring str=(*env)->NewStringUTF(env,"hello");

        (*env)->CallVoidMethod(env,jobject,methodId,str);

}

JNIEXPORT void JNICALL Java_com_example_ndkcallback_DataProvider_callMethod4
  (JNIEnv * env, jobject j){
    jclass clazz=(*env)->FindClass(env,"com/example/ndkcallback/MainActivity");
    //  jmethodID   (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
    // 方法簽名  參數和返回值
    jmethodID methodId=(*env)->GetMethodID(env,clazz,"helloFromJava","()V");
    // void        (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);
    // 需要創建DataProvider的 對象
    // jobject     (*AllocObject)(JNIEnv*, jclass);
    jobject obj=(*env)->AllocObject(env,clazz);  // new MainActivity();
    (*env)->CallVoidMethod(env,obj,methodId);

}

JNIEXPORT void JNICALL Java_com_example_ndkcallback_DataProvider_callMethod5
  (JNIEnv * env, jobject j){
    jclass clazz=(*env)->FindClass(env,"com/example/ndkcallback/DataProvider");
    //     jmethodID   (*GetStaticMethodID)(JNIEnv*, jclass, const char*, const char*);
     jmethodID  methodid=(*env)->GetStaticMethodID(env,clazz,"demo","()V");
    //void        (*CallStaticVoidMethod)(JNIEnv*, jclass, jmethodID, ...);
     (*env)->CallStaticVoidMethod(env,clazz,methodid);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章