文档章节

在mac上实践jni

朱方圆
 朱方圆
发布于 2016/10/17 20:17
字数 597
阅读 35
收藏 0

1.网上很多关于jni的入门代码都没有指明操作环境造成了理解上的很不方便,下面我记录下在mac上的操作过程,并且对一些步骤作简单说明

2.编写java文件,并且编译

java代码如下


public class Native{

 //这里定义native方法,native方法不能有方法体
 public native say();

}

public class Main{

 static{
   //这里加载相应的库文件,库文件的名字要和动态库匹配,这里动态库文件为libnative.jnilib
   System.loadLibrary("native");
 }
 public static void main(String[] args){

   Native n=new Native();
   n.say();
}
}

然后需要编译java代码  javac Main.java  然后会生成Main.class

3.生成Native头文件,头文件是javah这个工具生成的,生成的.h文件里面包含了native函数的格式,这时候需要自己编写一个.cpp文件来实现这个方法

生成.h文件:javah Native.java

Native.h的内容

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

#ifndef _Included_Native
#define _Included_Native
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     Native
 * Method:    say
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_Native_say
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

 

Native.cpp的内容

#include "Native.h"
#include <iostream>
using namespace std;

JNIEXPORT void JNICALL Java_Native_say
  (JNIEnv *, jobject){

   cout<<"Hello world"<<endl;


  }

4.生成动态库

这个操作可以分成两步,第一步生成.o文件,第二步生成.jnilib文件

第一步的指令: g++ -I /Users/kisstheraik/jdk1.8.0_101/include -I /Users/kisstheraik/jdk1.8.0_101/include/linux  -c Native.cpp 

      这里需要说明的是 -I指明了头文件的搜索路径(因为这里Native.h里面有个jni.h需要知道位置),-c告诉编译器这一步只编译不链接,不然可能会报错。这里会生成Native.o文件

第二步的指令: g++ -dynamiclib -o libnative.jnilib Native.o

      这里需要说明的是注意库的名字,并且一定记得后缀是jnilib,网上有很多mac平台教程的后缀都是so,我真不知道他们怎么做出来的

5.运行

从前面的代码中我们可以看到程序会加载libnative.jnilib这个库文件,加载路径实际上是一个名为“java.library.path”所指定的路径,这个路径包括了当前路径,因此不需要做改动就能运行。当然如果你的libnative.jnilib在其他地方记的把路径加到java.library.path变量里面。

运行: java Main

© 著作权归作者所有

朱方圆
粉丝 2
博文 24
码字总数 20023
作品 0
南京
私信 提问
如何为Android,Mac和Windows平台创建Java JNI动态链接库

Java Native Interface (JNI) 是Java和C/C++之间的桥梁。在一些情况下,为了提高Java程序的性能,扩展Java程序的功能,我们需要使用JNI。比如数据库的调用,当我们下载一个JDBC的jar包之后,...

yushulx
2014/09/17
1K
0
android JNI 使用 for mac

使用jni实现Java调用C代码,步骤: 1,下载ndk,链接:http://developer.android.com/tools/sdk/ndk/index.html;解压 , 2,如果是windows系统,需要安装Cygwin工具,这是window下模拟Linux...

宇宙执政
2014/01/03
1K
4
利用JNI调用Java工具类得到MAC地址

求上面这段代码的JNI版本。JNI+C(不能用C++)实现调用Java的工具类得到MAC地址。。。由于某些原因、不能直接用C获得MAC地址、需要JNI实现调用Java工具类。求帮助~...

ileler
2015/03/31
284
2
Android JNI MAC OS环境配置

Android JNI MAC OS环境配置 http://whbzju.github.io/blog/2013/06/01/android-jni-config/ JUN 1ST, 2013 | COMMENTS 前言—JNI技术简介 JNI是Java Native Interface的缩写,即“Java本地调......

whb_zju
2013/06/02
2.2K
0
JNI中调用任何标准输入输出处理流(std::stream)导致JVM崩溃?

大家好,我是JNI萌新!最近碰到一个很无解的问题,如标题所言。然后我也在Stackoverflow上搜索了一番,发现一个和我差不多的问题;但是解决办法对我没什么作用,我也在Stackoverflow上Post了...

frank_123
2017/05/08
330
4

没有更多内容

加载失败,请刷新页面

加载更多

Kafka实战(五) - 核心API及适用场景全面解析

1 四个核心API ● Producer API 允许一个应用程序发布一串流式的数据到一个或者多个Kafka topic。 ● Consumer API 允许一个应用程序订阅一个或多个topic ,并且对发布给他们的流式数据进行处...

JavaEdge
今天
11
0
实现线程的第三种方式——Callable & Future

Callable Runnable 封装一个异步运行的任务, 可以把它想象成为一个没有参数和返回值的异步方 法。Callable 与 Runnable 类似, 但是有返回值。Callable 接口是一个参数化的类型, 只有一 个...

ytuan996
今天
12
0
OSChina 周六乱弹 —— 不要摁F了!

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @巴拉迪维 : 朴树写的词曲都给人一种莫名的失落感,不过这首歌他自己却没有唱,换成赵传这种高音阶嘶喊的确很好,低沉但却有力,老男人的呐喊...

小小编辑
今天
24
1
Android Binder机制 - interface_cast和asBinder讲解

研究Android底层代码时,尤其是Binder跨进程通信时,经常会发现interface_cast和asBinder,很容易被这两个函数绕晕,下面来讲解一下: interface_cast 下面根据下述ICameraClient例子进行分析...

天王盖地虎626
昨天
13
0
计算机实现原理专题--存储器的实现(二)

计算机实现原理专题--存储器的实现(一)中描述了一种可以记住输入端变化的装置。现需要对其功能进行扩充,我们将上面的开关定义为置位,下面的开关定义为复位,然后需要增加一个保持位,当保...

FAT_mt
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部