Linux JNI 移植C++代码

版权声明:本文为博主原创文章,转载请加入原文链接,谢谢。。 https://blog.csdn.net/shawncheer/article/details/86368965

写这个post的原因是在网上找不到完整可以运行的demo,所以就自己写一篇.

本文主体采纳https://stackoverflow.com/questions/3950635/how-to-compile-dynamic-library-for-a-jni-application-on-linux

但是里面有的会出现错误.所有纠正一下.

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 查看本文章

然后编译,编译里面的sharedstatic选项不同用. 我机器上的命令是:

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文件路径写出绝对路径可以使得包路径不需要固定再原来的目录里。

猜你喜欢

转载自blog.csdn.net/shawncheer/article/details/86368965
今日推荐