小談jni jobject jclass

 

 

注意細節部分!

首先是java部分 封裝的類

package com.example.mynative;

import android.util.Log;

public class MyNativeLib

{

static String   TAG  = "MyNativeLib";

public native void myNative();

public static native void myStaticNative();

static

{

System.loadLibrary("nativeLib");

}

public void  jShow()

{

Log.e(TAG , " c call java method jshow");

}

public static void  jstaticShow ()

{

Log.e(TAG"c call static java method   jstaticShow");

}

}

用如下命令可以知道

Javah  -jni  com.example.mynative.myNativeLib

src 下面可以看到編譯的頭文件

/* DO NOT EDIT THIS FILE - it is machine generated */

#include <jni.h>

/* Header for class com_example_mynative_MyNativeLib */

#ifndef _Included_com_example_mynative_MyNativeLib

#define _Included_com_example_mynative_MyNativeLib

#ifdef __cplusplus

extern "C" {

#endif

/*

 * Class:     com_example_mynative_MyNativeLib

 * Method:    myNative

 * Signature: ()V

 */

JNIEXPORT void JNICALL Java_com_example_mynative_MyNativeLib_myNative

  (JNIEnv *, jobject);

/*

 * Class:     com_example_mynative_MyNativeLib

 * Method:    myStaticNative

 * Signature: ()V

 */

JNIEXPORT void JNICALL Java_com_example_mynative_MyNativeLib_myStaticNative

  (JNIEnv *, jclass);

#ifdef __cplusplus

}

#endif

#endif

注意這裏的不同。

nativeC裏面寫函數時

JNIEXPORT void JNICALL Java_com_example_mynative_MyNativeLib_myNative

  (JNIEnv *env, jobject   thiz)

{

   jmethodID c_jmothods ;

   jclass string_class =env->GetObjectClass(thiz);

if (string_class  == NULL)

{

LOGE("string_class  == NULL");

}else

{

c_jmothods  = env->GetMethodID(string_class"jShow","()V");

}

if (c_jmothods == NULL)

{

LOGE("c_jmothods  == NULL");

}

env->CallVoidMethod(thiz,c_jmothods);

//(調用靜態方法 )
  jmethodID c_staticjmothods ;

static const char *classPathName = "com/example/mynative/MyNativeLib";

//c層的方法
 jclass clazz =env->FindClass(classPathName);

// 也可以  jclass clazzenv->GetObjectClass(thiz);
 if (clazz == NULL)
 {
 LOGE("clazz == NULL");
 }
 else
 {
 c_staticjmothods = env->GetStaticMethodID(clazz, "jstaticShow","()V");

 }

 if (c_staticjmothods== NULL)
 {
 LOGE("c_staticjmothods == NULL");

 }
 env->CallStaticVoidMethod(clazz,c_staticjmothods);

}

JNIEXPORT void JNICALL Java_com_example_mynative_MyNativeLib_myStaticNative

  (JNIEnv *env , jclass   thiz

{

    jmethodID c_jmothods ;

   c_jmothods  = env->GetMethodID(string_class"jShow","()V");

if (c_jmothods == NULL)

{

LOGE("c_jmothods  == NULL");

}

//  方法一

jobject obj =env->AllocObject(thiz);

    env->CallVoidMethod(objc_jmothods);

//也可用下面的方法 

// jclass clazz = env->FindClass(classPathName);
// jmethodID mid = env->GetMethodID(clazz, "<init>", "()V");
// jmethodID post_event = env->GetMethodID(clazz, "jShow", "()V");
// jobject jobt = env->NewObject(clazz, mid);
// env->CallVoidMethod(jobt, post_event);

  jmethodID c_staticjmothods ;

 c_staticjmothods = env->GetStaticMethodID(thiz, "jstaticShow","()V");
 if (c_staticjmothods== NULL)
 {
 LOGE("c_staticjmothods == NULL");
 }
 env->CallStaticVoidMethod(thiz,c_staticjmothods);

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章