废话不多说,首先我们来看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

 public class Hello {

     static {
System.loadLibrary("hello");
} public native static void hello(String s); //声明本地库函数 public static void main(String[] args) {
hello("hello");
for(String s : args) hello(s);
}
}

2、使用 javah -jni Hello 命令生成  Hello.h

 /* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Hello */ #ifndef _Included_Hello
#define _Included_Hello
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Hello
* Method: hello
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_Hello_hello
(JNIEnv *, jclass, jstring); #ifdef __cplusplus
}
#endif
#endif

3、实现头文件 Hello.h 中的函数  JNIEXPORT void JNICALL Java_Hello_hello(JNIEnv *, jclass, jstring);

新建cpp文件 Hello.cpp  内容如下:

 #include <jni.h>
#include"Hello.h"
#include<iostream>
using namespace std;
JNIEXPORT void JNICALL Java_Hello_hello (JNIEnv* env, jclass jc, jstring s)
{
const char* str = env->GetStringUTFChars(s, );
cout << str << endl;
env->ReleaseStringUTFChars(s, str);
}

将 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、运行结果:

JNI技术实现--Java调C/C++的更多相关文章

  1. Android JNI编程(八)——体验AS2.2.2编写Jni程序、Java调C、C调Java函数、将C代码中的Log打印至Logcat

    版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 不得不说在AS2.2以上的版本进行开发就一个字——爽,在2.0上使用jni出 ...

  2. JNI测试-java调用c算法并返回java调用处-1到20阶乘的和

    一,java端: 定义native方法, 'public native long factorial(int n);', 该方法用c/c++实现,计算'1到20阶乘的和',参数中'int n'是前n项 ...

  3. Java如何调用C语言程序,JNI技术

    Java为什么要调用C语言编写的程序因为涉及操作系统底层的事件,Java是处理不了的,例如用户上传一个视频文件,需要后台给视频加上水印,或者后台分离视频流和音频流,这个事Java就做不了,只能交给C语 ...

  4. Java调优

    Java调优经验谈 对于调优这个事情来说,一般就是三个过程: 性能监控:问题没有发生,你并不知道你需要调优什么?此时需要一些系统.应用的监控工具来发现问题. 性能分析:问题已经发生,但是你并不知道问题 ...

  5. Java Native Interfce三在JNI中使用Java类的普通方法与变量

    本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 前面我们学习了如何在JNI中通过参数来使用J ...

  6. JNI技术概念小结

    JNI(Java Native Interface,JAVA原生接口) 使用JNI可以使Java代码和其他语言写的代码(如C/C++代码)进行交互. 问:为什么要进行交互? |-  首先,Java语言 ...

  7. JNI技术基础(2)——从零开始编写JNI代码

    书接上文: <JNI技术基础(1)——从零开始编写JNI代码> 2.编译源程序HelloWorld.java并生成HelloWorld.class 3.生成头文件HelloWorld.h ...

  8. JNI技术基础(1)——从零开始编写JNI代码

    众所周知,Java程序的最大特点就是其跨平台的特性,编写的上层应用程序可以不加任何修改甚至不用重新编译而运行于不同的平台上,然而,Java本身也存着这一个弊端,那就是性能上相对要差一些,在对性能要求比 ...

  9. [Android Webkit]JNI基础及Java层与C++层的交互

    1. JNI 注册 1.1. JNI的基础结构       JAVA == JNI == Native Code      JNI(Java Native Interface)是Java与Native ...

随机推荐

  1. 并发编程之多线程(Java)

    一.线程与进程区别 每个正在系统上运行的程序都是一个进程.每个进程包含一到多个线程.线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行.也可以把它理解为代码运行的上下文.所以线程基本上是 ...

  2. 1. jQuery中的DOM操作

    1)查找节点 通过jQuery选择器来完成 2)创建节点 创建元素节点:var newTd = $("<td></td>") 创建文本节点:在创建元素节点时 ...

  3. TensorFlow2.0(六):Dataset

    .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...

  4. Android实现apk插件方式换肤

    换肤思路: 1.什么时候换肤? xml加载前换肤,如果xml加载后换肤,用户将会看见换肤之前的色彩,用户体验不好. 2.皮肤是什么? 皮肤就是apk,是一个资源包,包含了颜色.图片等. 3.什么样的控 ...

  5. Spring Boot WebFlux 增删改查完整实战 demo

    03:WebFlux Web CRUD 实践 前言 上一篇基于功能性端点去创建一个简单服务,实现了 Hello .这一篇用 Spring Boot WebFlux 的注解控制层技术创建一个 CRUD ...

  6. vue使用vant-ui实现上拉加载、下拉刷新和返回顶部

    vue使用vant-ui实现上拉加载.下拉刷新和返回顶部 vue现在在移动端常用的ui库有vant-ui和mint-ui,上拉加载.下拉刷新和返回顶部也是移动端最基础最常见的功能.下面就用vant-u ...

  7. 如何去除CFormView的Scrollbar

    第一种方法: 重载 OnSize(UINT nType, int cx, int cy) 在CFormView::OnSize(nType, cx, cy)下面添加一句 ShowScrollBar(S ...

  8. OSX 10.14.2 安装Cocoapods 出现问题的解决方法

    今天尝试用 Cocoapods安装个第三方库.. 输入pod install, 发现 command not find. WTF! 估计是升级10.11后Cocoapods被干掉了. 我输入 sudo ...

  9. Focus on the Good 专注于好的方面

    [1]  Dealing with people is like digging for gold. When you go digging for an ounce of gold, you hav ...

  10. Python:numpy中shape和reshape的用法

    >>> w=np.zeros((5,6))>>> warray([[ 0.,  0.,  0.,  0.,  0.,  0.],       [ 0.,  0.,  ...