Mac下Java的native方法以及JNI调用C++语言

本文详细介绍了在Mac系统上使用JNI(Java Native Interface)进行跨语言编程的完整流程。从编写带有native声明的Java类开始,通过javac、javah等命令生成必要的文件,到使用C/C++实现本地方法,最后编译生成动态链接库,全面覆盖了JNI的使用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JNI的生成步骤——Mac版(参考资料

  1. 编写带有native声明的方法的java类,生成.java文件
  2. 使用javac命令编译所编写的java类,生成.class文件
  3. 使用javah -jni java类名生成扩展名为h的头文件,也即生成.h文件
  4. 使用C/C++(或者其他编程想语言)实现本地方法,创建.h文件的实现,也就是创建.cpp文件实现.h文件中的方法
  5. 将C/C++编写的文件生成动态连接库,生成jnilib文件

1、写 java 代码:HelloWorld.java

public class HelloWorld {
 
	static{
		System.loadLibrary("hello");
	}
	public native void DisplayHello();
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new HelloWorld().DisplayHello();
		//System.out.println( System.getProperty("java.library.path"));
	}
 
}

2、运行命令:javac HelloWorld.java

在该 HelloWorld.java 所在目录下生成 HelloWorld.class

3、运行命令:javah -jni HelloWorld

使用javah在当前目录下生成 HelloWorld.h 头文件,此文件供C、C++程序来引用并实现其中的函数

HelloWorld.h文件为自动生成,内容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class HelloWorld */
 
#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloWorld
 * Method:    DisplayHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloWorld_DisplayHello
  (JNIEnv *, jobject);
 
#ifdef __cplusplus
}
#endif
#endif

注:1)、此头文件是不需要用户编译的,直接供其它C、C++程序引用。
       2)、此头文件中的JNIEXPORT void JNICALL Java_HelloWorld_DisplayHello(JNIEnv *, jobject);方法,是将来与动态链接库交互的接口,并需要名字保持一致。
参考原文链接:https://blog.csdn.net/basementman/article/details/17996445

4、创建HelloWorld.cpp

实现头文件中的方法:

#include "jni.h"
#include "HelloWorld.h"
#include <stdio.h>
 
JNIEXPORT void JNICALL Java_HelloWorld_DisplayHello
(JNIEnv *env, jobject obj)
{
    printf("From HelloWorld.cpp :");
    printf("Hello world ! \n");
    return;
}

此C++文件实现了上述头文件中的函数,注意方法函数名要保持一致。


5、编译C/C++代码

基本格式:

  • 编译c程序:gcc -shared -fpic XXX.c -o XXX.so
  • 编译c++程序:g++ -shared -fpic XXX.cpp -o XXX.so

-------------------------------------以上内容基本是参考的网上的资料,以下内容未在网上找到完全相同的资料-------------------------------

我在mac上编译c++程序程序的命令:

g++ -I/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/include -I/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/include/darwin -fPIC -shared HelloWorld.cpp -o libhello.jnilib

/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/include,该路径为jni.h头文件所在的位置;

/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/include/darwin,该路径为jni_md.h头文件所在的位置;

g++编译程序时,-I(大写i) 与-L(大写l)-l(小写l) 的作用

6、当前目录下的全部文件

7、运行程序:java HelloWorld

 

参考的网络资料:

https://www.cnblogs.com/cnliang/p/10496248.html

https://blog.csdn.net/basementman/article/details/17996445

https://www.cnblogs.com/chaguang/p/8306106.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值