http://stuf.ro/calling-c-code-from-java-using-jni
2016-03-09 06:26
417 查看
In this tutorial we'll be creating a Java application calling code from a native library. We'll have a Java application called HelloWorld which will call the function
a shared library named
First off, we'll create a file named
Make the virtual machine aware of a function defined externally, named "helloFromC"
Load an external library called "ctest" (which will need to define this function)
Call the function we talked about
Even though we didn't write any library yet, we can still compile the Java application, because this is a dependency that will be resolved at runtime. So, let's compile the application:
This will generate a
the library is not created yet:
Alright, let's now start writing the
we created earlier. This header file will contain the definition of the function as it must be present in the C file.
This command will generate a HelloWorld.h file in the same directory, containing the following code:
We'll leave this file exactly as is, as the comment suggests, but we need to copy the function definition. Copy the definition and put it in a new file, named
Note that we gave names to the parameters. Now let's implement the function. Aside from our own includes, we also need to include
work. So, modify the
Now that we have the file, let's compile it and create a native library. This part is system dependent, but the only things that change really are the extension of the generated library file and the path to the
Replace
you're on Windows (remove the
the full path to the directory containing the file
on UNIX-like systems.
Once you successfully run the above command, you will see a
If you remember from the Java code you wrote earlier, the virtual machine will expect a library named
that, it means that a file with the name
To see this in action, run the application:
If everything works correctly, you should see:
原文地址: http://stuf.ro/calling-c-code-from-java-using-jni
helloFromCfrom
a shared library named
ctest, using Java Native Interface.
First off, we'll create a file named
HelloWorld.javato contain the
HelloWorldclass.
/* HelloWorld.java */ public class HelloWorld { native void helloFromC(); /* (1) */ static { System.loadLibrary("ctest"); /* (2) */ } static public void main(String argv[]) { HelloWorld helloWorld = new HelloWorld(); helloWorld.helloFromC(); /* (3) */ } }
Make the virtual machine aware of a function defined externally, named "helloFromC"
Load an external library called "ctest" (which will need to define this function)
Call the function we talked about
Even though we didn't write any library yet, we can still compile the Java application, because this is a dependency that will be resolved at runtime. So, let's compile the application:
javac HelloWorld.java
This will generate a
HelloWorld.classfile containing the application. Running the application will now result in an error, as we expect, because
the library is not created yet:
java HelloWorld
Exception in thread "main" java.lang.UnsatisfiedLinkError: no ctest in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1754) at java.lang.Runtime.loadLibrary0(Runtime.java:823) at java.lang.System.loadLibrary(System.java:1045) at HelloWorld.(HelloWorld.java:6)
Alright, let's now start writing the
ctestlibrary in C. To do that, we must first generate a header file from the
.classfile
we created earlier. This header file will contain the definition of the function as it must be present in the C file.
javah HelloWorld
This command will generate a HelloWorld.h file in the same directory, containing the following code:
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class HelloWorld */ #ifndef _Included_HelloWorld #define _Included_HelloWorld #ifdef __cplusplus extern "C" { #endif /* * Class: HelloWorld * Method: helloFromC * Signature: ()V */ JNIEXPORT void JNICALL Java_HelloWorld_helloFromC (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif
We'll leave this file exactly as is, as the comment suggests, but we need to copy the function definition. Copy the definition and put it in a new file, named
ctest.c:
/* ctest.c */ JNIEXPORT void JNICALL Java_HelloWorld_helloFromC (JNIEnv * env, jobject jobj) { }
Note that we gave names to the parameters. Now let's implement the function. Aside from our own includes, we also need to include
jni.hfor this to
work. So, modify the
ctest.cfile to contain something like:
/* ctest.c */ #include <jni.h> #include <stdio.h> JNIEXPORT void JNICALL Java_HelloWorld_helloFromC (JNIEnv * env, jobject jobj) { printf("Hello from C!\n"); }
Now that we have the file, let's compile it and create a native library. This part is system dependent, but the only things that change really are the extension of the generated library file and the path to the
jni.hinclude.
gcc -o libctest.so -shared -I/path/to/jdk/headers ctest.c -lc
Replace
.sowith
.dylibif you're on a Mac, or
.dllif
you're on Windows (remove the
libpart from the file name as well if you're on Windows). Also, replace
/path/to/jdk/headerswith
the full path to the directory containing the file
jni.h. If you don't know where that is, you can use the locate
jni.hcommand
on UNIX-like systems.
Once you successfully run the above command, you will see a
libctest.sofile in the current directory (or
libctest.dylibor
libctest.dll).
If you remember from the Java code you wrote earlier, the virtual machine will expect a library named
ctestto reside in the current directory (point 2). By
that, it means that a file with the name
libctest.soshould be here, which you just created.
To see this in action, run the application:
java HelloWorld
If everything works correctly, you should see:
Hello from C!
原文地址: http://stuf.ro/calling-c-code-from-java-using-jni
相关文章推荐
- [游戏开发]关于手游客户端网络带宽压力的一点思考
- 多尺度无序池化卷积神经网络——MOP-CNN(MultiScale Orderless Pooling)
- 【网络基本功能七】细说IP地址与子网
- 【网络基本功系列六】链路聚合
- TCP报文结构
- WRK-HTTP压力测试工的下载安装与使用方法
- VIEWGOOD(远古)搭建校园网络电视台系统
- android高效加载网络图片
- HttpURLConnection
- Oracle VM Virtualbox 中的网络连接类型
- 理解VMWare的三种网络连接模式(bridged、NAT、host-only)
- HTTP POST GET 本质区别详解
- NoHttp开源Android网络框架1.0.0之架构分析
- Maven依赖冲突之httpclient.jar包冲突异常分析
- TCP连接:“三次握手,四次挥手”
- 自组织神经网络介绍:自组织特征映射SOM(Self-organizing feature Map),第二部分
- 自组织神经网络介绍:自组织特征映射SOM(Self-organizing feature Map),第二部分
- 自组织神经网络介绍:自组织特征映射SOM(Self-organizing feature Map),第二部分
- <iframe width='738' height='523' class='preview-iframe' scrolling='no' frameborder='0' src='http://d
- JSP中<meta http-equiv="pragma" content="no-cache">中http-equiv功能介绍