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又没说清楚这事由编译器办。所以搞得我很郁闷。
分享到:
相关推荐
综上所述:先从c中得到dll文件,加在java后台里,相当于给java加了的本地方法或者接口,即可调用c的方法,后面再进阶学参数转换和方法调用。 接下来先搭建环境,测试下jni,最后再写开始写页面和看源码,因为我习惯...
3. **src** 文件夹:包含C/C++源代码,通常会有个“main”函数,它是Java层通过JNI调用的入口点。 4. **AndroidManifest.xml**: Android应用的配置文件,声明应用的基本信息,如包名、权限等。 5. **java** 文件夹:...
通过这个"JNI入门Demo3.0",我们可以深入理解动态注册Native函数的概念和实现,从而在实际项目中更灵活地使用JNI。需要注意的是,动态注册虽然方便,但也需要谨慎处理,因为它可能会引入运行时错误,如方法签名不...
jni4net是一个强大的工具,它实现了C#与Java之间的互操作性,允许开发者在两种不同的编程环境中自由地调用对方的API和功能。这个库基于JNI(Java Native Interface),是Java平台上的一个标准机制,用于在Java代码和...
- **JNI的双向调用**:不仅可以从Java代码调用C/C++代码,还可以从C/C++代码调用Java代码,这意味着两种语言之间的完全互操作性。 - **JNI与Java虚拟机**:JNI是Java平台的一部分,因此它必须遵循Java平台的规范。...
Java本地接口(JNI)是一种允许Java代码调用本地库(通常是C/C++编写的动态链接库DLL或其他类型的本地代码)的标准API。通过JNI,Java程序能够访问非Java编写的代码,从而实现跨语言的功能集成。 #### 书籍结构与...
JNI是java调用C++程序的一种实现方法,网上有一些相关的资料,但不一定能适用,这个文档我在学习JNI时综合网上资料总结的,本人亲测能够实现,希望下载的网友有什么问题多多反馈,希望对学习JNI的朋友有所帮助
JNI自Java 1.1版本引入以来,已经成为Java开发者与底层系统交互的重要工具,尤其在需要调用C/C++库或者利用硬件特定功能时。本教程将引领你从零开始,逐步精通JNI技术。 1. **JNI基础知识** - **JNI概述**:JNI...
// Java调用C public native int callToJava(); // C调用Java } ``` 这里的`System.loadLibrary("jnidemo")`用于加载名为"jnidemo"的动态链接库。这个库包含了JNI函数的实现。 接下来,我们需要使用`javah`工具...
Rust-Java-JNI 描述 这是一个有关如何使用JNI API将和连接在一起的实验项目。 这样您就可以从Java执行本机代码。 该存储库可用作入门指南。 如何繁殖 添加带有本机标识符的Java方法 运行javah class-file或javah -...
安卓app开发之NDK入门教程,JAVA代码通过JNI接口调用NDK代码(C语言编写的linux android功能).zip
2. **Java调用C++**: - 创建本地方法:在Java类中声明native方法,并使用`javah`工具生成对应的C++头文件,定义本地方法的签名。 - 实现本地方法:在C++代码中实现这个头文件中的函数,使用JNIEnv指针调用Java...
这个"Android JNI入门Demo"是一个适合初学者了解和学习JNI基础操作的实践项目。 在Android开发中,JNI的应用场景广泛,例如:提升性能的关键算法实现、调用系统库、访问硬件设备、游戏开发中的图形渲染等。下面将...
- Java程序调用非Java程序:介绍了如何从Java调用C/C++代码。 - C/C++访问Java成员变量和成员方法:详细说明了C/C++如何访问Java对象的状态和行为。 - 异常处理:讨论了如何在JNI中处理异常情况。 - MFC程序中...
JNI开发Java和C/C++互相传递List集合, 可以参考: Java从C/C++获取List集合对象:https://blog.csdn.net/niuba123456/article/details/80994166 Java传递List集合对象到C/C++ ...
此示例展示了如何声明本地方法,如何在本地代码中实现它,以及如何从Java调用本地方法。 #### 类型映射 JNI提供了类型映射机制,将Java数据类型转换为C/C++的数据类型,反之亦然。例如,Java的int类型映射到C的j...
- **JNI扩展了Java虚拟机的能力**:通过JNI,开发者可以在Java应用中调用本地C/C++代码,实现Java无法直接完成的任务,如驱动开发。 - **提高性能**:JNI使得Java能够利用C/C++的高效运算能力,尤其在数学计算、...
### JNI入门之HelloWorld(一)详解 #### 一、引言 JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码与其他语言写的代码进行交互。JNI接口提供了若干公共服务,并为Java虚拟机和本机应用程序或...
- **JNI环境指针**:JNI环境中提供了一个全局指针`JNIEnv*`,用于调用JNI接口中的函数。 - **JNI签名**:用于描述Java方法参数和返回值类型的字符串表示形式。 #### 四、JNI的使用步骤 1. **定义Java接口**:在...
"程序,或者是演示如何从Java调用C++函数的例子。通过学习这个实例,初学者可以更好地理解如何在Android应用中集成本地代码,以及如何在实际项目中使用JNI和NDK。 总之,`adt-bundle`、JNI和NDK是Android开发中的...