ubuntu下JNI之HelloWorld相互传String值

1、准备步骤ubuntu下配置好java、gcc相关的环境。

2.编写java文件

class JniTest {

    private native String getLine(String prompt);

    public static void main(String args[]) {
        JniTest jnitest = new Jnitest();
        String input = jnitest.getLine("Type a line: ");
        System.out.println("User typed: " + input);
    }

    static {
        System.loadLibrary("JniTest");
    }

}

3、编译java文件生成class

javac JniTest.java

4、生成 .h 文件

javah -jni JniTest

5、根据.h文件编写c代码

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class JniTest */
#ifndef _Included_JniTest
#define _Included_JniTest
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     JniTest
 * Method:    getLine
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */

JNIEXPORT jstring JNICALL Java_JniTest_getLine
  (jnienv *jnienv,jobject obj,jstring inputstr){
	  char outputstr[50];
	 int lenght = (*jnienv)->GetStringLength(jnienv,inputstr);
	 printf("inputstr lenght= %d",lenght);
	 printf("请输入一个字符串返回给java");
	 scanf("%s",outputstr);
	 return (*jnienv)->NewStringUTF(jnienv,outputstr);
  }
#ifdef __cplusplus
}
#endif
#endif

6、如果配置了android NDK的环境,可以用android,mk来编译生成so,从androidNDK的sample里找到一份Android.mk文件,与生成的JniTest.c代码放入jni文件夹下。或者直接用第7步的gcc命令来生成

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := JniTest
LOCAL_SRC_FILES := JniTest.c
include $(BUILD_SHARED_LIBRARY)

7、生成so文件,-I的作用是指定jni.h头文件的位置

gcc JniTest.c -I /home/guoshijie/下载/jdk1.8.0_111/include -I /home/guoshijie/下载/jdk1.8.0_111/include/linux -fPIC -shared -o libJniTest.so

8、执行class

因为生成的so并没有放入系统的lib库里,所以需要指定lib库路径

可以用如下命令指定当前命令行窗口的lib库路径

/home/guoshijie/test/testc/jni 下放的是生成的so

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/guoshijie/test/testc/jni

或者用

java -Djava.library.path=./jni JniTest

执行出的结果如下

guoshijie@guoshijie-virtual-machine:~/test/testc$ java -Djava.library.path=./jni JniTest
inputstr lenght= 13请输入一个字符串返回给javaaaa
User typed: aaa
guoshijie@guoshijie-virtual-machine:~/test/testc$

相关文章

目录前言一、创建Hadoop用户二、更新apt和安装Vim编辑器三、...
原文连接:https://www.cnblogs.com/yasmi/p/5192694.html ...
电脑重启后,打开VirtualBox,发现一直用的虚拟机莫名的消失...
参见:https://blog.csdn.net/weixin_38883338/article/deta...
Ubuntu 18.04 LTS 已切换到 Netplan 来配置网络接口。Netpla...
介绍每个 Web 服务都可以通过特定的 URL 在 Internet 上访问...