java 调 C (jni 与 jna)

本文对比了JNI(Java Native Interface)和JNA(Java Native Access)两种Java调用本地代码的方式。介绍了JNI无需额外jar包即可直接调用C/C++代码的特点,并提供了JNI示例代码。同时,阐述了JNA需要相关jar包和动态库支持的特点,以及如何将C头文件转换为Java头文件的过程。

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

一、 jni 

用jni一个好处就是不用加额外的jar包(例如jna需要加相关的jar包)
C代码中,C接口命名规则: Java_类路径_类名_函数名

jniDemo.cpp

#include <jni.h>
#include "jniDemo.h"

JNIEXPORT jint JNICALL Java_com_example_jnidemo_JniTestLib_Add
  (JNIEnv *jenv, jclass jc, jint a, jint b)
{
	return a+b;
}

jniDemo.h

/*
 * jniDemo.h
 *
 *  Created on: 2016年12月20日
 *      Author: ly
 */

#ifndef JNIDEMO_H_
#define JNIDEMO_H_
#include <jni.h>
#ifdef __cplusplus
extern "C" {
#endif

JNIEXPORT jint JNICALL Java_com_example_jnidemo_JniTestLib_Add
  (JNIEnv *jenv, jclass jc, jint a, jint b);


#ifdef __cplusplus
}
#endif

#endif /* JNIDEMO_H_ */
JniTestLib.java

package com.example.jnidemo;

public class JniTestLib {
	
	static
	{
		System.loadLibrary("jniDemo");
	}

	public native static int Add(int a, int b);

}
二、jna
1.需要加jna相关的jar包和动态库(jna.jar 和 libjnidispatch.so);
2.需要把C头文件转换成java头文件

jnaDemo.cpp

#include <jni.h>


int add(int a, int b)
{
	return a+b;
}
jnaDemo.h
#ifndef JNADEMO2_H_
#define JNADEMO2_H_
#ifdef __cplusplus
	extern "C" {
#endif

	int add(int a, int b);

#ifdef __cplusplus
	}
#endif
jnaDemo.h 转 TestAdd.java(转换的头文件) 用jna头文件转换工具

package com.example.jnidemo2;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.NativeLibrary;
/**
 * JNA Wrapper for library <b>testAdd</b><br>
 * This file was autogenerated by <a href="http://jnaerator.googlecode.com/">JNAerator</a>,<br>
 * a tool written by <a href="http://ochafik.com/">Olivier Chafik</a> that <a href="http://code.google.com/p/jnaerator/wiki/CreditsAndLicense">uses a few opensource projects.</a>.<br>
 * For help, please visit <a href="http://nativelibs4java.googlecode.com/">NativeLibs4Java</a> , <a href="http://rococoa.dev.java.net/">Rococoa</a>, or <a href="http://jna.dev.java.net/">JNA</a>.
 */
public interface TestAdd extends Library {
	public static final String JNA_LIBRARY_NAME = "jnidemo2";  //jnidemo2 动态库类名
	public static final NativeLibrary JNA_NATIVE_LIB = NativeLibrary.getInstance(TestAdd.JNA_LIBRARY_NAME);
	public static final TestAdd INSTANCE = (TestAdd)Native.loadLibrary(TestAdd.JNA_LIBRARY_NAME, TestAdd.class);
	/**
	 * Original signature : <code>int add(int, int)</code><br>
	 * <i>native declaration : line 14</i>
	 */
	int add(int a, int b);
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值