注意細節部分!
首先是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 clazz= env->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(obj, c_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);
}