使用jni从本机代码调用Java方法
我是JNI的新手.我成功编写了一些调用c语言编写的本机方法的程序.
现在我需要在初始化之后由本机代码端调用我的java代码.可能吗? 注意: http://www.codeproject.com/Articles/22881/How-to-Call-Java-Functions-from-C-Using-JNI JNI Call java method from c program 这些例子不能解决我的情况.因为我的主程序是在java中,我要问的是:我在java代码中调用的本机函数(用c编写)是否可以在某些情况下调用其他一些java函数?是否可以在不使用上面提到的轮询技术的情况下管理它? 解决方法
当然.它实际上比您链接的示例更容易,因为您不必生成JVM来执行它 – 调用您的java函数会为您提供指向您可以使用的环境的指针.举个简单的例子:使用这样的Java类:
public class foo { static { // load libfoo.so / foo.dll System.loadLibrary("foo"); } private native void nativecall(); public static void main(String[] args) { foo f = new foo(); f.nativecall(); } public void callback() { System.out.println("callback"); } public static void callback_static() { System.out.println("static callback"); } } 并且从C代码编译的库如下: #include <jni.h> JNIEXPORT void JNICALL Java_foo_nativecall(JNIEnv *env,jobject foo_obj) { // Get the class from the object we got passed in jclass cls_foo = (*env)->GetObjectClass(env,foo_obj); // get the method IDs from that class jmethodID mid_callback = (*env)->GetMethodID (env,cls_foo,"callback","()V"); jmethodID mid_callback_static = (*env)->GetStaticMethodID(env,"callback_static","()V"); // then call them. (*env)->CallVoidMethod (env,foo_obj,mid_callback); (*env)->CallStaticVoidMethod(env,mid_callback_static); } 你会得到输出 callback static callback 如果没有获得要使用的类的对象,可以使用FindClass和NewObject函数创建一个,如 jclass cls_foo = (*env)->FindClass (env,"foo"); jmethodID ctor_foo = (*env)->GetMethodID(env,"<init>","()V"); jobject foo_obj = (*env)->NewObject (env,ctor_foo); 进一步阅读here. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |