引用kimmking 的
主题:JNI技术实践小结--原理分析和详细步骤截图说明
http://www.iteye.com/topic/304594
现就说明如下,一般新手容易犯的错误
我是将这个类放到了一到eclipes下
一个工程Server
具体的测试类TestHello.java 放在了
E:\workspace\Server\src\test目录下
然后犯了
第一个错误
E:\workspace\Server\WebRoot\WEB-INF\classes\test>javah TestHello
错误:无法访问 TestHello
未找到 TestHello 的类文件
javadoc: 错误 - 找不到类 TestHello。
Error: 未在命令行中指定任何类。请尝试使用 -help。
E:\workspace\Server\WebRoot\WEB-INF\classes\test>
正确的做法
E:\>cd E:\workspace\Server\WebRoot\WEB-INF\classes\test
E:\workspace\Server\WebRoot\WEB-INF\classes\test>javah -classpath E:\workspace\Server\WebRoot\WEB-INF\classes test.TestHello
E:\workspace\Server\WebRoot\WEB-INF\classes\test>
第二个错误的地方是在编写dll时我修改了vc编译时引用的目录。但还是有问题。
后来干脆把jni.h,jni_md.h都拷贝到工程目录下。
就不用修改vc的引用目录了。
第三个地方
E:\workspace\Server\WebRoot\WEB-INF\classes\test>java TestHello
Exception in thread "main" java.lang.NoClassDefFoundError: TestHello
Caused by: java.lang.ClassNotFoundException: TestHello
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
Could not find the main class: TestHello. Program will exit.
E:\workspace\Server\WebRoot\WEB-INF\classes\test>
正确的做法
E:\workspace\Server\WebRoot\WEB-INF\classes>java -classpath E:\workspace\Server\
WebRoot\WEB-INF\classes test.TestHello
E:\workspace\Server\WebRoot\WEB-INF\classes>
JNI(Java Native
Interface)应用程序一般是一个Java类,在这个类中定义了几个native方法,并在类的初始化过程中加载动态库,例如下面这个类
public class SystemInfo{
static {
System.loadLibrary("SystemInfo");
}
public static native long getPhysicalMemory();
}
当Web项目用到该类并由于其他类的修改导致项目(context)重新加载,这个时候SystemInfo的初始化就会出异常,直接导致SystemInfo这个不可用,因为JNI中不允许一个动态库被加载两次,而且也没法通过程序来卸载前面所加载的动态库。
怎么来解决因为context重新加载而导致JNI类无法试用的问题呢?
其实这个问题不难,我们只要不让JNI类重新加载即可。但是一般的应用服务器对Web项目中文件都是默认重新加载的,例如WEB-INF/classes以及WEB-INF/lib目录。如此我们便不能将JNI类放在这两个目录下,但是我们又必须保证这个JNI类能被Web项目的其他类引用到,因此这就需要参照不同应用服务器的类路径的说明进行设置,对于Tomcat而言,我们可以把这个JNI类单独打包并放在{tomcat}commonlib目录下,并删除web项目中的这个JNI类即可解决前面提到的问题。
如何在Tomcat下的部署使得java web可以访问此DLL接口
第一步:将生成的文件放在哪里?有两种情况:
如果是java应用程序调用的话,就放置在我的机器是win xp 我就放在system32文件夹下。
如果是java web 开发的话,就是放置在JAVA_HOME的根目录下的bin文件夹下。
第二步:将eclipse下的java web项目,在tomcat下进行部署,并运行.
到此如何用java 调用DLL文件结束。
注:
当类中有package时进行包.类的打包
生成的dll文件要放在%JAVA_HOME%\bin目录下
分享到:
相关推荐
本教程通过一个简单的"Android JNI使用demo"来讲解如何在Android应用中集成和使用JNI。 1. **JNI基础知识**: - JNI接口定义了一套标准的函数,使得Java代码能够调用本地方法(用C/C++编写),反之亦然。 - 在...
它提供了丰富的API,可以在多种编程语言中使用,包括C/C++,非常适合在JNI层使用。下面我们将深入讲解如何在Android项目中集成libcurl,并通过JNI调用来执行HTTP请求和文件下载。 1. **集成libcurl** - 首先,你...
以下是对Android JNI使用方法的详细步骤和解释: 1. **创建Android项目**: 首先,你需要在Android Studio中创建一个新的Android项目。在这个例子中,项目名为`jniceshi2`。 2. **编写Java类并生成.class文件**:...
本教程将通过一个实际的JNI使用Demo源码,深入讲解JNI的关键概念和使用方法。 ### 1. C/C++调用Java 在Android应用中,我们常常需要在C/C++代码中调用Java方法。这需要通过`JNIEnv`指针来完成,`JNIEnv`包含了所有...
在这个"CarDVR jni使用实例"中,我们可以深入探讨JNI的基本概念、工作原理以及如何在实际项目中应用。 首先,我们需要了解JNI的核心概念。JNI是Java平台提供的一种接口,它定义了一套标准的C/C++函数调用规范,使得...
### JNI使用规范详解 #### 一、JNI概述 Java Native Interface (JNI) 是Java平台提供的一种标准机制,它允许Java程序直接调用本地代码(如C或C++)。这一功能自Java 1.1版本起便被纳入Java的标准库中。通过JNI,...
这个"android jni使用demo"是一个基础的示例,展示了如何在Android应用中调用C/C++原生代码。 在Android应用开发中,JNI的常见用途包括: 1. **性能优化**:对于计算密集型任务,如图像处理、音频/视频编码解码,C...
标题“JNI开发第二步:20130726 NDK_JNI使用”涉及到的是Android平台下的JNI(Java Native Interface)技术与NDK(Native Development Kit)的结合使用。JNI是Java平台标准的一部分,它允许Java代码和其他语言写的代码...
jni使用string相互调用 Java 传递 String 给C C 传递 jstring 给 Java
JNI使用文档首先介绍了在Java中使用原生代码的必要性,即在内存管理和性能上克服Java的限制。随后文档会带你进入具体的操作,首先是“GettingStarted”部分,介绍了如何将C代码与Java代码结合起来。 在“Getting...
这个“JNI使用实例”可能是一个详细的教程,涵盖了如何在Android应用程序中设置和使用JNI的基本步骤。首先,我们需要创建一个Java类,声明native方法,这些方法将在本地代码中实现。例如: ```java public class ...
在实际开发中,为了简化JNI的使用,可以利用一些框架,如Android NDK(Native Development Kit),它提供了一套工具和库,使得在Android应用中使用C/C++代码更加方便。NDK支持预编译的库,以及通过JNI接口与Java代码...
理解什么是 JNI JNI的操作步骤 JNI的适用场合
这篇内容将深入探讨JNI的使用以及与Android NDK的结合。 首先,我们需要理解JNI的基本概念。JNI是一个接口,让Java代码能够调用本地(native)代码,同时也允许本地代码调用Java对象和方法。通过JNI,开发者可以在...
总结一下,本示例提供的`testndk`项目是一个结合使用AIDL和JNI的实践案例,展示了如何在Android应用中进行跨进程通信并利用C/C++代码提升性能。通过阅读源码和配合博客文章,你可以深入理解这两种技术的工作原理和...
在本示例中,我们关注的是如何在JNI中使用`jobjectArray`来处理Java对象数组。 `jobjectArray`是JNI中的一个类型,它代表了Java世界中的对象数组。使用`jobjectArray`,我们可以从本地代码创建、访问和修改Java对象...
本示例着重讲解如何使用JNI结合libzip库来读取压缩文件,同时对比了通过NDK自带的API接口读取assets资源文件的方法。 libzip是一个开源的C库,用于处理ZIP档案,包括读取、创建、更新和提取文件。在Android环境中,...
使用`javah`命令(在Android Studio中是`javah -jni`,在现代的Android开发环境中可能需要使用`javac -h`)根据Java类生成JNI头文件。这会创建一个.h文件,包含了C函数的声明,这些函数将被C/C++代码实现。 ```bash...
本教程将深入探讨如何在Android JNI中使用静态(static)变量,以实现Java层与原生代码之间的数据共享。 首先,了解JNI的基本概念是必要的。JNI为Java应用程序提供了一个接口,可以调用本地方法(即非Java代码),...