Ubuntu 使用Jni开发实例详解

 更新时间:2016年10月24日 11:51:34   投稿:lqh  
这篇文章主要介绍了Ubuntu 使用Jni开发实例详解的相关资料,需要的朋友可以参考下

1. 编写Java文件,在其中声明native方法, 并通过static 语句块加载动态链接库,示例Prompt.java代码如下:

class Prompt {
  private native String getLine(String prompt);

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

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

2.调用javac命令生成Prompt.class文件;

javac Prompt.java

3.调用javah命令生成Prompt.h头文件供C程序引用:

javah -jni Prompt

自动生成的头文件如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Prompt */

#ifndef _Included_Prompt
#define _Included_Prompt
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:   Prompt
 * Method:  getLine
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_Prompt_getLine
 (JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

4.编写Prompt.c文件实现具体功能:

#include <jni.h>
#include <stdio.h>
#include "Prompt.h"

JNIEXPORT void JNICALL
Java_Prompt_getLine(JNIEnv *env, jobject obj, jstring prompt) 
{
  char buf[128];
  const jbyte *str;
  str = (*env)->GetStringUTFChars(env, prompt, NULL);
  if(str == NULL) {
    return NULL;    
  }
  printf("%s", str);
  (*env)->ReleaseStringUTFChars(env, prompt, str);
  scanf("%s", buf);
  return (*env)->NewStringUTF(env, buf);
}

5. 编译动态库libPrompt.so;

gcc -shared -fpic -I/usr/lib/jvm/java-6-sun-1.6.0.26/include -I/usr/lib/jvm/java-6-sun-1.6.0.26/include/linux Prompt.c -o libPrompt.so

6. 运行。

java Prompt

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • Java Agent (代理)探针技术详情

    Java Agent (代理)探针技术详情

    这篇文章主要介绍了Java Agent 探针技术详情,Java 中的 Agent 技术可以让我们无侵入性的去进行代理,最常用于程序调试、热部署、性能诊断分析等场景,下文更多相关资料,感兴趣的小伙伴可以参考一下
    2022-04-04
  • Java内存模型之happens-before概念详解

    Java内存模型之happens-before概念详解

    happens-before原则非常重要,它是判断数据是否存在竞争、线程是否安全的主要依据,依靠这个原则,我们解决在并发环境下两操作之间是否可能存在冲突的所有问题。下面我们就一个简单的例子稍微了解下happens-before知识,感兴趣的朋友一起看看吧
    2021-06-06
  • JAVA如何定义构造函数过程解析

    JAVA如何定义构造函数过程解析

    这篇文章主要介绍了JAVA如何定义构造函数过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • springboot拦截器不拦截静态资源,只拦截controller的实现方法

    springboot拦截器不拦截静态资源,只拦截controller的实现方法

    这篇文章主要介绍了springboot拦截器不拦截静态资源,只拦截controller的实现方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Spring通过配置文件管理Bean对象的方法

    Spring通过配置文件管理Bean对象的方法

    这篇文章主要介绍了Spring通过配置文件管理Bean对象的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • Java实现LeetCode(报数)

    Java实现LeetCode(报数)

    这篇文章主要介绍了Java实现LeetCode(报数),本文通过使用java实现leetcode的报数题目和实现思路分析,需要的朋友可以参考下
    2021-06-06
  • java集合中的list详解

    java集合中的list详解

    这篇文章主要介绍了java集合中的list详解,还是比较不错的,这里分享给大家,需要的朋友可以参考下。
    2017-11-11
  • 如何把springboot jar项目 改为war项目

    如何把springboot jar项目 改为war项目

    这篇文章主要介绍了如何把springboot jar项目 改为war项目,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Java抽象定义以及举例代码

    Java抽象定义以及举例代码

    这篇文章主要给大家介绍了关于Java抽象定义以及举例的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • WebFlux 服务编排使用优势详解

    WebFlux 服务编排使用优势详解

    这篇文章主要为大家介绍了WebFlux 服务编排使用优势示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05

最新评论