版权声明:本文为博主原创文章,转载请加入原文链接,谢谢。。 https://blog.csdn.net/shawncheer/article/details/86368965
写这个post的原因是在网上找不到完整可以运行的demo,所以就自己写一篇.
但是里面有的会出现错误.所有纠正一下.
1.生成com_hello_hello_java.h文件.
递归创建文件夹:
mkdir -p com/hello/
写com/hello/hello_java.java代码:
package com.hello;
class hello_java {
static {
//System.loadLibrary("hello_cpp_so");
}
public native int sayHello(String strName);
public static void main(String[] args){
hello_java hj = new hello_java();
int return_num = hj.sayHello("Fengge!");
}
}
很多教程里面没有参数,但是我这边加了一个参数.另外libXXXX.so,这里的XXXX就是我们程序里面的hello_cpp_so字符串.
然后输入以下两个命令来生成com_hello_hello_java.h文件:
javac com/hello/hello_java.java
javah -jni com.hello.hello_java
其中,com_hello_hello_java.h的内容为:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_hello_hello_java */
#ifndef _Included_com_hello_hello_java
#define _Included_com_hello_hello_java
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_hello_hello_java
* Method: sayHello
* Signature: (Ljava/lang/String;)I
*/
JNIEXPORT jint JNICALL Java_com_hello_hello_1java_sayHello
(JNIEnv *, jobject, jstring);
#ifdef __cplusplus
}
#endif
#endif
后面的JNI接口C++文件就是依据上面这个头文件来写的.
2.接下来是要写hello_cpp.cpp文件.
代码:
#include <jni.h>
#include "com_hello_hello_java.h"
#include <stdio.h>
using namespace std;
JNIEXPORT jint JNICALL Java_com_hello_hello_1java_sayHello(JNIEnv * env, jobject obj, jstring jstrName){
const char *strName= env->GetStringUTFChars(jstrName,0);
printf("%s %s !! \n","Hello",strName);
return 0;
}
函数的参数名需要根据实际来修改,比如我这里的JNIEnv * env, jobject obj, jstring jstrName这几个.
扫描二维码关注公众号,回复:
5278550 查看本文章
然后编译,编译里面的shared和static选项不同用. 我机器上的命令是:
g++ -I"/usr/lib/jvm/java-8-openjdk-amd64/include"
-I"/usr/lib/jvm/java-8-openjdk-amd64/include/linux"
-o libhello_cpp_so.so -shared -Wl,-soname,hello_cpp_so.so hello_cpp.cpp -lc -fPIC
3.运行java代码.
首先把当前路径放到java.library.path里面(参考),可以用以下命令:
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/home/shawn/Operation/hello_jni"
并且可以使用一下命令查看java.library.path属性:
java -XshowSettings:properties
最后,运行下面语句:
java com.hello.hello_java
实验结果如下:
shawn@shawn-VirtualBox:~/Operation/hello_jni$ java com.hello.hello_java
Hello Fengge! !!
完毕.
2019/1/18 更新:这里的so文件路径写出绝对路径可以使得包路径不需要固定再原来的目录里。