废话不多说,首先我们来看Java调用C/C++步骤:
1.编写Java代码,在代码中使用native关键字标明该方法是调用本地库,不需要实现。
2.使用javah -jni 命令,生成对应的头文件,此步骤主要是规范化本地代码,总所周知,Java是平台无关的,但是C/C++是平台相关的,所以需要规范本地代码,使其表示的值与Java中的值意义相同。
3.用C/C++实现头文件中的接口函数,并把其编译链接成动态链接库,在环境变量设置动态库路径。
4.在Java代码中添加加载动态链接库的代码,并将其编译为class文件。
5.运行并测试效果。
example:
1、java代码:Hello.java
1 public class Hello { 2 3 static { 4 System.loadLibrary("hello"); 5 } 6 7 public native static void hello(String s); //声明本地库函数 8 9 public static void main(String[] args) { 10 hello("hello"); 11 for(String s : args) hello(s); 12 } 13 }
2、使用 javah -jni Hello 命令生成 Hello.h
1 /* DO NOT EDIT THIS FILE - it is machine generated */ 2 #include <jni.h> 3 /* Header for class Hello */ 4 5 #ifndef _Included_Hello 6 #define _Included_Hello 7 #ifdef __cplusplus 8 extern "C" { 9 #endif 10 /* 11 * Class: Hello 12 * Method: hello 13 * Signature: (Ljava/lang/String;)V 14 */ 15 JNIEXPORT void JNICALL Java_Hello_hello 16 (JNIEnv *, jclass, jstring); 17 18 #ifdef __cplusplus 19 } 20 #endif 21 #endif
3、实现头文件 Hello.h 中的函数 JNIEXPORT void JNICALL Java_Hello_hello(JNIEnv *, jclass, jstring);
新建cpp文件 Hello.cpp 内容如下:
1 #include <jni.h> 2 #include"Hello.h" 3 #include<iostream> 4 using namespace std; 5 JNIEXPORT void JNICALL Java_Hello_hello (JNIEnv* env, jclass jc, jstring s) 6 { 7 const char* str = env->GetStringUTFChars(s, 0); 8 cout << str << endl; 9 env->ReleaseStringUTFChars(s, str); 10 }
将 Hello.cpp 编译成动态库 libhello.so:g++ -fPIC -shared -IXXX_jni -IXXX_jni_md Hello.cpp -o libhello.so 其中 XXX_jni 为jni.h的路径, XXX_jni_md 为 jni_md.h 的路径
4、编译 Hello.java : javac Hello.java 生成 Hello.class 最好还要添加 libhello.so 路径到环境变量才能运行。
5、运行结果:
原文:https://www.cnblogs.com/my-cnblogs-com/p/8947501.html