jni入门demo。java调c,c调java
JNI(Java Native Interface)是Java平台的标准组成部分,它允许Java代码和其他语言写的代码进行交互。JNI在许多场景下非常有用,比如需要利用已有的C/C++库、优化性能的关键算法或者接入操作系统特定的功能。本教程将带你入门JNI,了解如何在Java中调用C代码,以及C代码如何回调Java。 我们要创建一个Java类,声明一些本地方法(native methods)。本地方法是Java方法,但其实现是在C或C++中完成的。例如: ```java public class JNIDemo { static { System.loadLibrary("jnidemo"); // 加载本地库 } public native void callFromJava(int value); // Java调用C public native int callToJava(); // C调用Java } ``` 这里的`System.loadLibrary("jnidemo")`用于加载名为"jnidemo"的动态链接库。这个库包含了JNI函数的实现。 接下来,我们需要使用`javah`工具生成C头文件。这一步骤会根据Java类中的本地方法声明创建C函数原型。例如: ```bash javah -jni JNIDemo ``` 这将在当前目录下生成一个`JNIDemo.h`文件,内容类似于: ```c /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class JNIDemo */ #ifndef _Included_JNIDemo #define _Included_JNIDemo #ifdef __cplusplus extern "C" { #endif /* * Class: JNIDemo * Method: callFromJava * Signature: (I)V */ JNIEXPORT void JNICALL Java_JNIDemo_callFromJava (JNIEnv *, jobject, jint); /* * Class: JNIDemo * Method: callToJava * Signature: ()I */ JNIEXPORT jint JNICALL Java_JNIDemo_callToJava (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif ``` 现在我们有了C函数的原型,可以在C源文件中实现它们。例如`jnidemo.c`: ```c #include <jni.h> #include "JNIDemo.h" JNIEXPORT void JNICALL Java_JNIDemo_callFromJava(JNIEnv *env, jobject obj, jint value) { // 在这里实现C代码逻辑,可能包括回调Java方法 } JNIEXPORT jint JNICALL Java_JNIDemo_callToJava(JNIEnv *env, jobject obj) { // 实现C到Java的回调 return 42; // 返回一个示例值 } ``` 为了使C代码能够调用Java方法,你需要使用JNI提供的API。例如,如果你想在C代码中调用Java方法,可以使用`CallVoidMethod`或`CallIntMethod`等函数。在`callFromJava`中,你可以这样做: ```c JNIEXPORT void JNICALL Java_JNIDemo_callFromJava(JNIEnv *env, jobject obj, jint value) { jclass demoClass = (*env)->GetObjectClass(env, obj); jmethodID printMethod = (*env)->GetMethodID(env, demoClass, "printValue", "(I)V"); if (printMethod == NULL) { printf("Failed to find method 'printValue'\n"); return; } (*env)->CallVoidMethod(env, obj, printMethod, value); } ``` 在这个例子中,`printValue`是Java类`JNIDemo`的一个方法,接受一个整型参数并无返回值。 编译C源代码为动态链接库。这通常涉及到编译和链接步骤,使用`gcc`或`g++`,并链接JNI库: ```bash gcc -shared -o libjnidemo.so -I/usr/lib/jvm/java-8-openjdk-amd64/include -I/usr/lib/jvm/java-8-openjdk-amd64/include/linux jnidemo.c ``` 现在,你可以在Java程序中使用这个本地库,通过`System.loadLibrary`加载,并调用本地方法。这样,你就完成了从Java到C的调用,以及C到Java的回调。 总结起来,JNI提供了Java与C/C++之间的桥梁,使得开发者能够充分利用这两种语言的优点。通过JNI,我们可以轻松地集成现有C/C++库,实现高性能计算,或者访问特定操作系统的功能。理解并熟练使用JNI是任何Java开发者的宝贵技能。
- 1
- 2
- 3
- 4
- 5
- 6
- 20
- 粉丝: 44
- 资源: 15
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助