java工程中也可以利用JNI调用C/C++函数,并不是只能在Android项目中。
主要分四步:
- 在java工程中,首先声明native方法。这里我们使用eclipse建立一个java工程。
- 使用jdk中的javah 工具,生成native方法对应的 .h 文件。这个文件是给C/C++工程中使用的。
- 在C/C++工程中,引入 .h 文件。
- 在C/C++工程中,实现在.h 文件中声明的函数。
- 生成dll 文件
- 将dll 文件,添加到环境变量PATH里面。否则 System.loadlibarary()这个动态库会找不到。
1,如下是我们创建的一个java工程,在ricardo.jin.test 包下。文件名为TestJni.java
2,使用javah 工具生成 .h
这里我们可以参考书 《深入理解Android 卷I》中的\\第2章 深入理解JNI\\2.4.1 注册JNI函数
3, 可以看到生成的.h 文件如下:
|
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class ricardo_jni_test_TestJni */
#ifndef _Included_ricardo_jni_test_TestJni #define _Included_ricardo_jni_test_TestJni #ifdef __cplusplus extern "C" { #endif /* * Class: ricardo_jni_test_TestJni * Method: getStringFromC * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_ricardo_jni_test_TestJni_getStringFromC (JNIEnv *, jclass);
#ifdef __cplusplus } #endif #endif
|
可以看到这个文件中,只含有声明为native 的方法。
4,在我们的C++工程中,引入这个.h文件。
fix 编译的issue。 找不到 jni.h, 竟然在JDK目录下有这个文件,所以拷贝过来。同样还有 jni_md.h 。
注意:一定要手动的将文件拷贝到工程文件夹内才行。只是加入工程还是提示找不到文件。
让这个工程编译成dll 库。=》在Solution Explorer 点击右键 -》Properties -》在Configuration Properties的General中,将project default修改,由EXE 修改为 dll.
在工程的debug 目录下,这样就生成了 jni_study.dll 这个库文件。