`
bits00
  • 浏览: 74769 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

java 调用C--jni入门

阅读更多

 

1. Tnative.java 

    首先创建目录结构: com\test\,然后在test目录下创建一个java类Tnative.java 。

    关键之处有2个地方

    System.loadLibrary("hello");这句代码用于加载动态链接库(hello.dll)。

    public static native void hello();声明一个native方法,该方法没有方法体,说明需要调用其他语言实现。

 

package com.test;

public class Tnative {
	static {
		System.loadLibrary("hello");
	}
	
	public static native void hello();
	
	public static void main(String[] args) {
		hello();
	}
}

 

 

2.  编译java文件

    首先设置环境变量:classpath=.;T:\work

    javac Tnative.java         命令生成文件:Tnative.class

    javah com.test.Tnative  命令生成文件:com_test_Tnative.h

    

 

 

3. 编写C代码com_test_Tnative.c,实现头文件com_test_Tnative.h里面的方法。

    com_test_Tnative.h

 

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

#ifndef _Included_com_test_Tnative
#define _Included_com_test_Tnative
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_test_Tnative
 * Method:    hello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_test_Tnative_hello
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

 

    com_test_Tnative.c

 

#include <stdio.h>
#include "com_test_Tnative.h"

JNIEXPORT void JNICALL Java_com_test_Tnative_hello (JNIEnv * env, jclass obj)
{
	printf("hello !");
}

 

 

 

3. 编译c文件,生成动态库hello.dll

首先介绍使用VC++2010编译器:

    1. 新建 --> 输入名称:hello --> 选择DLL,空项目。

    2. 把文件com_test_Tnative.h,com_test_Tnative.c复制到项目里。

    3. 右击hello --> 属性 --> C++目录 --> 包含目录 --> 编辑

     在这里添加2项头文件包含路径:

     $(java_home)\include

      $(java_home)\include\win32

    4.然后开始编译,将生成的文件 hello.dll 放入环境变量classpath的路径下(classpath=.;T:\work);

    5.然后运行:

     java com.test.Tnative

    6.也可以吧 hello.dll 放入其他目录,然后用-D指定动态库路径:

     java com.test.Tnative -Djava.library.path=T:\work\vc\hello\Debug\

 

使用MinGW编译器:

    1. 设置环境变量:c_include_path=%java_home%\include;%java_home%\include\win32;

    2. 生成控制台模式的标准动态库,(不能用于jni)

     gcc -o hello.dll -shared com_test_Tnative.c

    3. 生成jni调用的动态库

     gcc -o hello.dll -shared com_test_Tnative.c -Wl,--add-stdcall-alias

    参数:-Wl,--add-stdcall-alias 可以为函数加上标准调用前缀(stdcall @nn)。 

    这样编译出的dll就可以了。都知道win32中dll中的函数要求有标准调用前缀,在JNI中不方便手动处理这个,Sun又没说清楚这事由编译器办。所以搞得我很郁闷。

 

4
6
分享到:
评论
3 楼 whj251017 2012-07-09  
直接用 JNA 这个jar 包, java调用所有的Dll就非常简单了
2 楼 qqsheji 2012-07-09  
顶你 讲的很详细
1 楼 luke_shine 2012-07-09  
这个不错,顶你一下

相关推荐

    前台java 后台c 结合技术----JNI.docx

    综上所述:先从c中得到dll文件,加在java后台里,相当于给java加了的本地方法或者接口,即可调用c的方法,后面再进阶学参数转换和方法调用。 接下来先搭建环境,测试下jni,最后再写开始写页面和看源码,因为我习惯...

    hello-jni_jni_android_

    3. **src** 文件夹:包含C/C++源代码,通常会有个“main”函数,它是Java层通过JNI调用的入口点。 4. **AndroidManifest.xml**: Android应用的配置文件,声明应用的基本信息,如包名、权限等。 5. **java** 文件夹:...

    JNI入门Demo3.0

    通过这个"JNI入门Demo3.0",我们可以深入理解动态注册Native函数的概念和实现,从而在实际项目中更灵活地使用JNI。需要注意的是,动态注册虽然方便,但也需要谨慎处理,因为它可能会引入运行时错误,如方法签名不...

    jni4net C# java 相互调用

    jni4net是一个强大的工具,它实现了C#与Java之间的互操作性,允许开发者在两种不同的编程环境中自由地调用对方的API和功能。这个库基于JNI(Java Native Interface),是Java平台上的一个标准机制,用于在Java代码和...

    Android开发书籍 - JNI详解_导航版

    - **JNI的双向调用**:不仅可以从Java代码调用C/C++代码,还可以从C/C++代码调用Java代码,这意味着两种语言之间的完全互操作性。 - **JNI与Java虚拟机**:JNI是Java平台的一部分,因此它必须遵循Java平台的规范。...

    Java本地接口(JNI)编程指南和规范

    Java本地接口(JNI)是一种允许Java代码调用本地库(通常是C/C++编写的动态链接库DLL或其他类型的本地代码)的标准API。通过JNI,Java程序能够访问非Java编写的代码,从而实现跨语言的功能集成。 #### 书籍结构与...

    JNI快速实现入门(java调用C++程序的方法)

    JNI是java调用C++程序的一种实现方法,网上有一些相关的资料,但不一定能适用,这个文档我在学习JNI时综合网上资料总结的,本人亲测能够实现,希望下载的网友有什么问题多多反馈,希望对学习JNI的朋友有所帮助

    java jni从入门到精通

    JNI自Java 1.1版本引入以来,已经成为Java开发者与底层系统交互的重要工具,尤其在需要调用C/C++库或者利用硬件特定功能时。本教程将引领你从零开始,逐步精通JNI技术。 1. **JNI基础知识** - **JNI概述**:JNI...

    jni入门demo。java调c,c调java

    // Java调用C public native int callToJava(); // C调用Java } ``` 这里的`System.loadLibrary("jnidemo")`用于加载名为"jnidemo"的动态链接库。这个库包含了JNI函数的实现。 接下来,我们需要使用`javah`工具...

    Rust-Java-JNI:关于如何使用JNI(Java本机接口)将Rust和Java连接在一起的实验项目

    Rust-Java-JNI 描述 这是一个有关如何使用JNI API将和连接在一起的实验项目。 这样您就可以从Java执行本机代码。 该存储库可用作入门指南。 如何繁殖 添加带有本机标识符的Java方法 运行javah class-file或javah -...

    安卓app开发之NDK入门教程,JAVA代码通过JNI接口调用NDK代码(C语言编写的linux android功能).zip

    安卓app开发之NDK入门教程,JAVA代码通过JNI接口调用NDK代码(C语言编写的linux android功能).zip

    教你java和C++的jni编程

    2. **Java调用C++**: - 创建本地方法:在Java类中声明native方法,并使用`javah`工具生成对应的C++头文件,定义本地方法的签名。 - 实现本地方法:在C++代码中实现这个头文件中的函数,使用JNIEnv指针调用Java...

    Android JNI入门Demo

    这个"Android JNI入门Demo"是一个适合初学者了解和学习JNI基础操作的实践项目。 在Android开发中,JNI的应用场景广泛,例如:提升性能的关键算法实现、调用系统库、访问硬件设备、游戏开发中的图形渲染等。下面将...

    网上整理的JNI教程

    - Java程序调用非Java程序:介绍了如何从Java调用C/C++代码。 - C/C++访问Java成员变量和成员方法:详细说明了C/C++如何访问Java对象的状态和行为。 - 异常处理:讨论了如何在JNI中处理异常情况。 - MFC程序中...

    JNI开发Java和C/C++互相传递List集合

    JNI开发Java和C/C++互相传递List集合, 可以参考: Java从C/C++获取List集合对象:https://blog.csdn.net/niuba123456/article/details/80994166 Java传递List集合对象到C/C++ ...

    JNI-Java Native Interface资料(精华)

    此示例展示了如何声明本地方法,如何在本地代码中实现它,以及如何从Java调用本地方法。 #### 类型映射 JNI提供了类型映射机制,将Java数据类型转换为C/C++的数据类型,反之亦然。例如,Java的int类型映射到C的j...

    C入门&&JNI;

    - **JNI扩展了Java虚拟机的能力**:通过JNI,开发者可以在Java应用中调用本地C/C++代码,实现Java无法直接完成的任务,如驱动开发。 - **提高性能**:JNI使得Java能够利用C/C++的高效运算能力,尤其在数学计算、...

    JNI入门之HelloWorld(一)

    ### JNI入门之HelloWorld(一)详解 #### 一、引言 JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码与其他语言写的代码进行交互。JNI接口提供了若干公共服务,并为Java虚拟机和本机应用程序或...

    jni开发入门+深入

    - **JNI环境指针**:JNI环境中提供了一个全局指针`JNIEnv*`,用于调用JNI接口中的函数。 - **JNI签名**:用于描述Java方法参数和返回值类型的字符串表示形式。 #### 四、JNI的使用步骤 1. **定义Java接口**:在...

    adt-bundle JNI NDK 初学者实例

    "程序,或者是演示如何从Java调用C++函数的例子。通过学习这个实例,初学者可以更好地理解如何在Android应用中集成本地代码,以及如何在实际项目中使用JNI和NDK。 总之,`adt-bundle`、JNI和NDK是Android开发中的...

Global site tag (gtag.js) - Google Analytics