jniはjava層の静的および非静的関数を呼び出す

2980 ワード

jni呼び出しjavaの関数は大きく次の3つのステップに分けられます.
  • (*env)->FindClassによってクラスのオブジェクトが見つかりました
  • メソッドId
  • は、(*env)->GetMethodIDによって取得される
  • コール(*env)-

  • 実装手順の詳細
  • まずjava層の静的および非静的方法
  • を記述する
    package clz;
    public class ClassMethod {
    	public ClassMethod(){ //    
    		System.out.println("ClassMethod() constructor");
    	}
    	private static void callStaticMethod(String str, int i) { //    
    		System.out.format("ClassMethod::callSatticMethod called!-->str=%s,"+
    				" i=%d
    ", str,i); } private void callInstanceMethod(String str, int i) { // System.out.format("ClassMethod::callInstanceMethod called!-->str=%s,"+ "i=%d
    ",str,i); } }
  • javaレイヤnativeメソッド宣言を作成し、メソッド登録を使用してc言語を生成する.hファイルを登録します.登録方法は
  • を参照してください.
    public class JniTest {
    	native void callJavaStaticMethod();
    	native void callJavaInstanceMethod();
    }
    
  • .h対応の.cファイルを新規作成し、.hファイル
  • を導入
  • javaスタティックメソッド
  • をCで呼び出す
    #include "clz_JniTest.h"
    JNIEXPORT void JNICALL Java_clz_JniTest_callJavaStaticMethod
            (JNIEnv *env, jobject jobject){
        //1.      class  
        jclass clz = (*env)->FindClass(env,"clz/ClassMethod");
        if(clz == NULL){
            printf("clz is null");
            return;
        }
        //2.    id
        jmethodID jmeid = (*env)->GetStaticMethodID(env,clz,"callStaticMethod","(Ljava/lang/String;I)V");
        if(jmeid==NULL){
            printf("jmeid is null");
            return;
        }
        jstring  arg = (*env)->NewStringUTF(env,"     ");
        //3.  java   
        (*env)->CallStaticVoidMethod(env,clz,jmeid,arg,100);
        (*env)->DeleteLocalRef(env,clz);
        (*env)->DeleteLocalRef(env,arg);
    }
    
  • は、java非静的方法
  • をCで呼び出す.
    JNIEXPORT void JNICALL Java_clz_JniTest_callJavaInstanceMethod
            (JNIEnv * env, jobject jobject0){
    	//1.    class  
        jclass clz = (*env)->FindClass(env,"clz/ClassMethod");
        if(clz == NULL){
            printf("clz is null");
            return;
        }
        //2.        
        jmethodID jcmid = (*env)->GetMethodID(env,clz,"","()V");
        if(jcmid == NULL){
            printf("jcmid is null");
            return;
        }
        //3.    
        jobject jobject = (*env)->NewObject(env,clz,jcmid);
        if(jobject == NULL){
            printf("jobject is NULL");
            return;
        }
        //4.    id
        jmethodID jmeid = (*env)->GetMethodID(env,clz,"callInstanceMethod","(Ljava/lang/String;I)V");
        if(jmeid==NULL){
            printf("jmeid is null");
            return;
        }
        jstring  arg = (*env)->NewStringUTF(env,"hello from jni");
        //5.       
        (*env)->CallVoidMethod(env,jobject,jmeid,arg,100);
        (*env)->DeleteLocalRef(env,clz);
        (*env)->DeleteLocalRef(env,jobject);
        (*env)->DeleteLocalRef(env,arg);
    }
    

    ソースのgithubアドレス