先从一个经典例子说起,Java如何调用本地接口。

步骤如下:

1.创建HelloWorld.java

  1. class HelloWorld
  2. {
  3. static{
  4. System.loadLibrary("HelloWorld");
  5. }
  6. public native void myprint();
  7. public static void main(String[] args)
  8. {
  9. new HelloWorld().myprint();
  10. }
  11. }

2.编译生成Class文件HelloWorld

  1. >javac HelloWorld.java

3.生成文件头HelloWorld.h

  1. >javah -jni HelloWorld

4.C语言编写本地方法HelloWorld.c

  1. #include "HelloWorld.h"
  2. JNIEXPORT void JNICALL
  3. Java_HelloWorld_myprint(JNIEnv *env,jobject obj){
  4. printf("Hello World !\n");
  5. return;
  6. }

5.编译本地C方法生成类库dll文件或者so文件

  1. >gcc -Wl,--add-stdcall-alias -shared -Ic:\java\jdk1.6\include -Ic:\java\jdk1.6\include\win32 -o HelloWorld.dll HelloWorld.c
  1. 或者:
  2. >cl -Ic:\Java\jdk1.6\include -Ic:\Java\jdk1.6\include\win32 -LD HelloWorld.c -FeHelloWorld.dll
  1. 如果没有c的编译环境需要安装编译环境或者gcc 参数:-I接目录位置,中间无需空格
  1. ★关键 dll文件需要存放到 jdk的bin目录或者system32下面

6.测试HelloWorld

  1. >java HelloWorld
  2. Hello World !

这个经典小例子一般在命令行下面没有什么问题,容易出错的地方就是dll 存放位置不对。运行的时候无法加载dll。

常见错误:

       1. java.lang.UnsatisfiedLinkError: no HelloWorld in java.library.path

       2. Exception in thread "main" java.lang.UnsatisfiedLinkError: xxx.xxx.HelloWorld.myprint()V

网上总结很多。错误1,主要是没有办法path路径中加载。错误2主要是没有myprint方法,类库加载没有问题。

排除dll本身问题(网上不少人遇到),dll没有问题,加载路径也没有问题,不能连接到方法。这个在命令行的时候不容易发现问题,移到生产环境中容易出现,可能你已经猜到了,HelloWorld.java包路径,类的包路径要和生成头文件类包路径一致

http://www.360doc.com/content/09/0402/09/107226_2994393.shtml

Java调用本地接口的更多相关文章

  1. Java调用本地接口:java.lang.UnsatisfiedLinkError

    Java调用本地接口:java.lang.UnsatisfiedLinkError 我的问题不在这篇文章描述中, 而是因为jni原来是c实现, 现在切换到cpp了, 需要在对应的cpp文件中加入ext ...

  2. Android使用JNI(从java调用本地函数)

    当编写一个混合有本地C代码和Java的应用程序时,需要使用Java本地接口(JNI)作为连接桥梁.JNI作为一个软件层和API,允许使用本地代码调用Java对象的方法,同时也允许在Java方法中调用本 ...

  3. [JNI] Java 调用 C++ dll

    首先介绍一下JNI吧! JNI 是Java提供的一个用于调用本地接口的接口层,位于Java代码 和 本地代码之间的一层:主要功能是 数据类型的转换,还有就是通过这一层来调用本地代码! 下面就说说Jav ...

  4. java调用C++的过程

    转自https://blog.csdn.net/yjhdxflqm/article/details/50503551 jni是java和C.C++通信的桥梁. java适合写上层的应用,C.C++适合 ...

  5. 基于 Android NDK 的学习之旅-----Java 调用C

    随便谈谈为什么要Java调用C 吧: 我认为: 1.  有些公司开发Android项目的时候, 许多组件功能可能是C中已经实现了,所以我们没必要同样的功能又在java中实现一遍.例如我之前做的一个项目 ...

  6. JAVA调用 keytool 生成keystore 和 cer 证书

    keytool是一个Java数据证书的管理工具, keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件中在keystore里, 包含两种数据: 密钥实体( ...

  7. java调用mysql服务做备份与恢复

    首先添加mysql的bin到环境变量,这样可以简写部分命令,并且做到不依赖系统mysql的具体安装路径. 重启计算机可以让添加的环境变量在java代码中调用时生效.(cmd中生效但java中调用没有生 ...

  8. 存储过程详解与java调用(转)

    存储过程的一些基本语法: --------------创建存储过程----------------- CREATE PROC [ EDURE ] procedure_name [ ; number ] ...

  9. c++ c# java 调用 c++ 写的dll

    1. vs 中新建win32 dll 项目   testdll 添加实现文件       test.cpp #include "stdafx.h" #include <ios ...

随机推荐

  1. TCP/IP体系结构-测试人员必须理解的

    如果还想在测试这条路上继续走下去的话,那么下面这些东西就是我们必须去掌握的,至少你还不想止步于简单的黑盒测试--其实,一直想去接触Linux下的应用测试,这样能学到东西会很多,而且会非常的受用.之前听 ...

  2. mb_detect_encoding() 运行sitemap.php 字符编码不能转换修改php.ini

    1.phpinfo() 找php.ini位置 2.备份然后 php.ini文件中顶部添加extension=php_mbstring.dll Call to undefined function mb ...

  3. parseSdkContent failed 解决方案

    开Eclipse出现错误“parseSdkContent failed”,Android的模拟器启动不了.尝试了不少方法,终于搞定. 1.删除文件夹 C:\Documents and Settings ...

  4. android,view的执行过程onDraw、onSizeChanged,onFinishInflate

    小试view的执行过程,此是入门,高手绕道. ----------------------------------------------------------------------------- ...

  5. 打开另外一个App

    /** * 打开一个app * * @param packageName * @param data * @return */ public static boolean lanuchApp(Cont ...

  6. sql 比较2个test字段的值

    可以用 CAST([TEXT字段]AS VARCHAR(MAX)),然后再比较

  7. TCP数据包结构

    源端口号( 16 位):它(连同源主机 IP 地址)标识源主机的一个应用进程.目的端口号( 16 位):它(连同目的主机 IP 地址)标识目的主机的一个应用进程.这两个值加上 IP 报头中的源主机 I ...

  8. HTML+CSS D08浮动

    1. <html> <head> <title>div浮动</title> <style type="text/css"> ...

  9. MFC 透明内存DC

    在MFC中绘制比较复杂图形,通常采用双缓冲技术来绘图,的确可以大大加快绘制速度和减少闪烁,但是有些情况也不尽然. 我最近遇到了一个问题,采用的也是双缓冲来加快绘图,但是绘制效果还是不尽人意.A对象里大 ...

  10. Converting between IEEE 754 and Float (Format related

    The float can be converted to well known single-precision IEEE 754 number, why 754? It's the standar ...