前期准备:
1、Java JDK
2、gcc
3、g++
注意:gcc和g++的版本号要一致:如下:
linux(Fedora) 安装gcc yum install gcc 安装g++ yum install
gcc-c++
确保上述准备工作完成后开始下边的工作:
public class Hello {
static {
try {
System.loadLibrary("hello" );
} catch (UnsatisfiedLinkError e) {
e.printStackTrace();
}
}
public Hello() {};
public native void SayHello(String strName);
}
终端输入 javac Hello.java 后生成Hello.class 文件
然后:javah Hello 生成 Hello.h文件
然后在相同的目录下新建一个Hello.cpp文件:内容如下:
接下来编译生成共享库:
-
gcc -I/usr/lib/jvm/java-
1.6
.
0
-openjdk-
1.6
.
0.0
/include -I/usr/lib/jvm/java-
1.6
.
0
-openjdk-
1.6
.
0.0
/include/linux -fPIC -c Hello.cpp
注意:这儿可能产生的错误:
1、
-
gcc: error trying to exec
'cc1plus'
: execvp: No such file or directory
原因:没有安装g++,或者gcc和g++的版本不一致
2、
-
/usr/lib/jvm/java-
1.6
.
0
-openjdk-
1.6
.
0.0
根据自己机器实际的目录做相应的调整
-
<pre name=
"code"
class=
"plain"
style=
"background-color: rgb(255, 255, 255); font-weight: bold;"
>编译成功后生成Hello.o</pre>
- gcc -shared -Wl,-soname,libhello.so.
1
-o libhello.so.
1.0
Hello.o
此命令生成生成 libhello.so.1.0
接下来将生成的共享库拷贝为标准文件名
cp libhello.so. 1.0 libhello.so
最后通知动态链接程序此共享文件的路径。
export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH
接下来将生成的共享库拷贝为标准文件名
cp libhello.so.1.0 libhello.so
最后通知动态链接程序此共享文件的路径。
export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH
最后是java测试代码:
public class ToSay
{
public static void main(String argv[])
{
ToSay say = new ToSay();
}
public ToSay()
{
Hello h = new Hello();
// 调用本地方法向 John 问好
h.SayHello("John" );
}
}
用 javac 编译 ToSay.java,生成 ToSay.class
向执行普通 Java 程序一样使用 java ToSay,我们会看到在屏幕上出现 Hello,John。
应用中注意事项:
1 . 如果可以通过 TCP/IP 实现 Java 代码与本地 C/C++ 代码的交互工作,那么最好不使用以上提到的 JNI 的方式,因为一次 JNI 调用非常耗时,大概要花 0.5 ~ 1 个毫秒。
2 . 在一个 Applet 应用中,不要使用 JNI。因为在 applet 中可能引发安全异常。
3 . 将所有本地方法都封装在单个类中,这个类调用单个 DLL。对于每种目标操作系统,都可以用特定于适当平台的版本替换这个 DLL。这样就可以将本地代码的影响减至最小,并有助于将以后所需的移植问题包含在内。
4 . 本地方法要简单。尽量将生成的 DLL 对任何第三方运行时 DLL 的依赖减到最小。使本地方法尽量独立,以将加载 DLL 和应用程序所需的开销减到最小。如果必须要运行时 DLL,则应随应用程序一起提供它们。
5 . 本地代码运行时,没有有效地防数组越界错误、错误指针引用带来的间接错误等。所以必须保证保证本地代码的稳定性,因为,丝毫的错误都可能导致 Java 虚拟机崩溃。
参考链接:http://www.ibm.com/developerworks/cn/java/l-linux-jni/
分享到:
相关推荐
本文将指导读者如何在 Eclipse 中搭建 JNI 开发环境,并使用 CDT 插件进行 C/C++ 代码的编写和编译。 环境搭建 1. 安装 CDT 插件 CDT(C/C++ Development Tooling)是 Eclipse 中的 C/C++ 开发插件。可以从官方...
在本主题中,我们将深入探讨如何在Windows和Linux环境中利用JNI来生成动态链接库(DLL for Windows,SO for Linux),并使Java能够调用C++编写的函数。 1. **Java调用C++的基本原理** - JNI为Java应用程序提供了一...
在本示例中,我们看到的是一个JNI的学习实践,它在Linux环境下成功地执行了。这个例子展示了如何通过Java调用本地(C/C++)代码,并且提供了完整的流程,包括从Java类型转换为C类型,特别是将`jstring`转化为`char`...
5. **环境设置**:在进行JNI开发前,需要确保NetBeans IDE包含了Java和C/C++模块,并且安装了相应的JDK和C/C++编译器。如果需要,可以通过NetBeans的“Tools” > “Plugins”来安装缺失的模块。 6. **项目创建**:...
本资源“JNI开发.rar”显然是关于如何进行JNI开发的教程或参考资料。 JNI开发主要包括以下几个核心知识点: 1. **JNI接口定义**:JNI提供了一系列的C/C++函数接口,这些接口在Java层通过`System.loadLibrary`加载...
### JNI开发步骤详解 #### 一、JNI简介 JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在Java中主要用于调用C/C++函数,以此来实现高性能计算或其他Java...
Java JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。...这个模板为初学者提供了一个完整的JNI开发流程示例,通过实践可以更好地理解和掌握JNI的使用。
在开始之前,确保你已经安装了JDK,因为JNI开发需要用到javah工具。同时,还需要一个C/C++编译器,如GCC,用于编写和编译本地方法。 二、创建Java类 首先,我们需要创建一个Java类,声明一些将由本地方法实现的函数...
学习JNI编程时,确保正确配置了Java开发环境,并在C/C++项目中包含`jni.h`头文件是基础步骤。然后,通过理解并使用头文件中定义的数据类型、函数和常量,可以创建本地库,实现Java与本地代码的交互。同时,`jni_md.h...
本文将深入探讨如何利用NDK(Native Development Kit)进行JNI开发,特别是针对20130801_NDK_JNI的.so文件开发,以及如何在Android平台上访问Linux驱动。 首先,理解JNI的核心概念是至关重要的。JNI为Java开发者...
通过以上步骤,我们完成了在Linux环境下使用C语言通过JNI调用Java类的全过程。这种技术广泛应用于高性能计算、系统集成、设备驱动等多个场景,是Java和C/C++混合编程的关键技术。在实际应用中,可能还需要处理更复杂...
在实际开发中,开发者通常只需要包含`jni.h`,因为`jni_md.h`会被`jni.h`自动包含。当在不同平台上编译本地库时,编译器会自动选择正确的`jni_md.h`。 总结来说,JNI头文件是连接Java和本地代码的关键,`jni.h`提供...
本教程将深入探讨Linux环境下的JNI实例以及JNI编程模板。 1. JNI基础: JNI提供了一种标准方式,让Java虚拟机(JVM)能够调用本地方法(即非Java语言编写的函数)。本地方法通常用C或C++编写,可以充分利用硬件...
在windows环境下的jni.h jni_md.h文件。 实际上是从jdk1.8安装完毕后,从文件夹下取得的。 jni.h在【jdk1.8.0_144\include】...jni_md.h在【jdk1.8.0_144\include\win32】路径下(linux版把win32换成linux)。
JNI在很多场景下非常有用,比如当需要利用已有的C或C++库,或者提升性能时,我们可以通过JNI将Java代码与本地代码集成。 在描述中提到的`jni.h`和`jni_md.h`是JNI编程中必不可少的头文件。`jni.h`包含了JNI接口的...
JNI在很多场景下都是必要的,比如调用操作系统本地库、加速性能关键的代码或者利用硬件特性等。本文将深入探讨JNI的两个核心头文件——`jni.h`和`jni_md.h`。 首先,`jni.h`是JNI的主要接口头文件,包含了所有JNI的...
JNI(Java Native Interface)是Java平台提供的一种标准接口,用于...随着Android Studio的普及,现在更推荐使用Android Studio内置的CMake和NDK-Build支持来进行JNI开发,这简化了配置流程,使得跨语言开发更加便捷。
总结起来,JNI开发涉及Java和C/C++代码的结合,通过声明本地方法、生成头文件、实现本地逻辑、编译本地库以及在Java中加载库,实现Java与本地代码的交互。生成和调用jar包时,需考虑跨平台兼容性和本地库的加载。...