多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
上一个示例展示了如何在Native代码中调用对象实例方法,同样的,你可以从Native方法调用静态方法,只需要按照以下步骤操作即可: * 使用GetStaticMethodID获取方法ID * 将类,方法ID和参数传递给静态方法,比如CallStaticVoidMethod, CallStaticBooleanMethod等。 调用静态函数和非静态函数的最大区别是,前者使用类引用作为函数的第二个参数,而后者使用对象实例。例如,你传个类引用给CallStaticVoidMethod,而传递对象实例引用给CallVoidMethod. 让我们来看一个调用静态函数的示例,它仅仅是对之前的InstanceMethodCall示例做了些许改动。 ~~~ class StaticMethodCall { static { System.loadLibrary("StaticMethodCall"); } private native void nativeMethod(); private static void callback(){ System.out.println("In Java"); } public static void main(String[] args){ StaticMethodCall c = new StaticMethodCall(); c.nativeMethod(); } } ~~~ 如下是Native代码实现: ~~~ #include <jni.h> #ifdef __cplusplus extern "C" { #endif /* * Class: StaticMethodCall * Method: nativeMethod * Signature: ()V */ JNIEXPORT void JNICALL Java_StaticMethodCall_nativeMethod (JNIEnv * env, jobject obj){ jclass cls = (*env)->GetObjectClass(env, obj); jmethodID mid = (*env)->GetStaticMethodID(env, cls, "callback", "()V"); if(!mid) { return; /* method not found */ } printf("In C\n"); (*env)->CallStaticVoidMethod(env, cls, mid); } #ifdef __cplusplus } #endif ~~~ 使用如下命令build Native代码: `gcc -I/home/wangli/env/jdk8/usr/java/jdk1.8.0_20/include -I/home/wangli/env/jdk8/usr/java/jdk1.8.0_20/include/linux StaticMethodCall.c -shared -o libStaticMethodCall.so -fPIC -std=c99` 使用如下命令执行: `java -Djava.library.path=. -cp . StaticMethodCall` 你会得到如下输出: ~~~ In C In Java ~~~