国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - JNI實現最簡單的JAVA調用C/C++代碼

JNI實現最簡單的JAVA調用C/C++代碼

2020-12-09 14:06IT_xiao小巫 Java教程

這篇文章主要介紹了JNI實現最簡單的JAVA調用C/C++代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下

jni,是java native interface的簡稱,中文是“java本地調用”。通過這種技術可以做到以下兩點:

  1. java程序中的函數可以調用native語言寫的函數,native一般指的是c/c++編寫的函數。
  2. native程序中的函數可以調用java層的函數,也就是說在c/c++程序中可以調用java的函數。

本篇博客帶給童鞋們以下內容,學習內容來自(傳智播客),經由小巫總結整理:

  • javah工具的用法
  • 按照c/c++頭文件來編寫c/c++源文件
  • 將c/c++源文件編譯成動態連接庫(dll)
  • 在java程序中引入動態連接庫等知識

jni并不是什么特別神奇的東西,當初sun推出它的目的是為了屏蔽不同操作系統平臺的差異性,通過java語言來調用native語言的功能模塊,避免重復制作車輪,最主要是這兩個目的。

最簡單的java調用c/c++代碼,有以下步驟,童鞋們最好詳細閱讀,避免出現相應的錯誤:

  • 首先在java類中聲明一個native的方法
  • 使用javah命令生成native方法的聲明的c/c++頭文件
  • 按照生成的c/c++頭文件來編寫c/c++源文件
  • 將c/c++源文件編譯成動態鏈接庫(dll)
  • 將dll文件加入到path環境變量下
  • java類中加載dll,然后調用聲明方法

我們現在一步一步把整個流程熟悉一遍,在eclipse中創建一個java項目:

JNI實現最簡單的JAVA調用C/C++代碼  

筆者創建了一個命為:testnativecode的項目,新建包名為com.wwj.nativecode,新建類為testnativecode

接著在testnativecode類當中聲明我們的本地方法:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
package com.wwj.nativecode;
 
public class testnativecode {
  // 聲明本地方法
  public native void sayhello();
  public static void main(string[] args) {
//   // 加載動態鏈接庫
//   system.loadlibrary("nativecode");
//   testnativecode nativecode = new testnativecode();
//   nativecode.sayhello();
 
  }
}

注釋掉的代碼后面很快會用到,暫時不用管。

我們聲明了本地方法之后,就可以用jdk中javah命令來為我們生成對應的頭文件,在命令可以敲入javah -help:

JNI實現最簡單的JAVA調用C/C++代碼

會顯示出javah命令的一些使用參數和意義。

找到我們java項目testnativecode的路徑:筆者這里是d:\workspace\testnativecode

JNI實現最簡單的JAVA調用C/C++代碼

我們進入bin目錄,就可以找到對應的字節碼文件:

JNI實現最簡單的JAVA調用C/C++代碼

我們用這個來生成我們所需要的.h文件:

JNI實現最簡單的JAVA調用C/C++代碼

格式為:javah 包名.文件名

生成成功后,我們可以在當前路徑下生成的.h文件:

JNI實現最簡單的JAVA調用C/C++代碼

以上的步驟已經很清楚的介紹如何使用javah命令生成native頭文件。受用編輯器打開頭文件,有以下代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* do not edit this file - it is machine generated */
#include <jni.h>
/* header for class com_wwj_nativecode_testnativecode */
 
#ifndef _included_com_wwj_nativecode_testnativecode
#define _included_com_wwj_nativecode_testnativecode
#ifdef __cplusplus
extern "c" {
#endif
/*
 * class:   com_wwj_nativecode_testnativecode
 * method:  sayhello
 * signature: ()v
 */
jniexport void jnicall java_com_wwj_nativecode_testnativecode_sayhello
 (jnienv *, jobject);
 
#ifdef __cplusplus
}
#endif
#endif

接著在visual studio中創建一個win32控制臺應用程序,取名為nativecode:

JNI實現最簡單的JAVA調用C/C++代碼

JNI實現最簡單的JAVA調用C/C++代碼

創建成功后,將我們生成的頭文件剪切到c++項目中,并在項目中引入:

JNI實現最簡單的JAVA調用C/C++代碼

JNI實現最簡單的JAVA調用C/C++代碼

新建源文件:source.cpp

JNI實現最簡單的JAVA調用C/C++代碼

根據頭文件來編寫源文件:

JNI實現最簡單的JAVA調用C/C++代碼

我們發現代碼中有錯,原因是我們沒有引入“jni.h"頭文件,jni.h頭文件是在我們的jdk目錄下,include文件夾下:

JNI實現最簡單的JAVA調用C/C++代碼

把jni.h復制到項目中去,運行項目發現如下錯誤:

1>------ 已啟動生成: 項目: nativecode, 配置: debug win32 ------

1>  source.cpp

1>c:\users\administrator\documents\visual studio 2012\projects\nativecode\nativecode\jni.h(45): fatal error c1083: 無法打開包括文件:“jni_md.h”: no such file or directory

========== 生成: 成功 0 個,失敗 1 個,最新 0 個,跳過 0 個 ==========

還是缺少頭文件了,jni_md.h也是在jdk中:

JNI實現最簡單的JAVA調用C/C++代碼

同樣把它添加到項目中去:

JNI實現最簡單的JAVA調用C/C++代碼

現在代碼已經沒有錯誤提示了,運行成功之后會生成我們需要的dll文件,在對應的debug目錄下可以找到:

JNI實現最簡單的JAVA調用C/C++代碼

接著把這個動態庫添加到path環境變量中去,筆者的路徑為(c:\users\administrator\documents\visual studio 2012\projects\nativecode\debug):

JNI實現最簡單的JAVA調用C/C++代碼

最后在eclipse中使用java調用我們的native代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
package com.wwj.nativecode;
 
public class testnativecode {
  // 聲明本地方法
  public native void sayhello();
  public static void main(string[] args) {
    // 加載動態鏈接庫
    system.loadlibrary("nativecode");
    testnativecode nativecode = new testnativecode();
    nativecode.sayhello();
 
  }
}

運行java項目,如果聲明了環境變量之后,沒有重啟eclipse會報這樣的錯:

JNI實現最簡單的JAVA調用C/C++代碼

這時我們重啟一下eclipse讓環境變量生效即可。

但最后調用的時候出現了這個錯誤,小巫暫未解決:

JNI實現最簡單的JAVA調用C/C++代碼

望路過的大神,給你解決方案,動態庫是加載成功了,但調用方法是時候出現錯誤了。

很抱歉隔了這么久才來更新這篇博客,小巫之前的這個錯誤已經解決掉了,為什么會出現鏈接錯誤呢,主要還是鏈接庫的問題。

我們創建的vs項目,是win32的平臺,而小巫的操作系統是64位的,所以我在eclipse加載鏈接庫的時候會報錯。那么如何來解決這個問題呢,我們需要配置vs編譯的平臺,我們需要配置為x64位。

JNI實現最簡單的JAVA調用C/C++代碼

JNI實現最簡單的JAVA調用C/C++代碼

配置完之后,重新編譯運行,在項目根目錄會生成x64的目錄

JNI實現最簡單的JAVA調用C/C++代碼

然后我們把使用x64平臺生成的動態鏈接庫配置到環境變量中去:

我的路徑是:c:\users\administrator\documents\visual studio 2012\projects\nativecode\x64\debug

接著我們重啟eclipse,運行我們的測試項目,這個時候就沒有錯誤了。

JNI實現最簡單的JAVA調用C/C++代碼

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://blog.csdn.net/wwj_748/article/details/28136061

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产在线一二三区 | 日韩中文一区二区三区 | 黑人xxx视频 | 啪啪导航 | 午夜免费视频福利 | 国产97色在线 | 亚洲 | 精品国产不卡一区二区三区 | 亚洲欧美日韩另类精品一区二区三区 | 久久精品中文字幕 | 日韩精品一区二区三区视频播放 | 伦一区二区三区中文字幕v亚洲 | 羞羞动漫在线观看 | 日韩91| 香蕉久久久久久 | 久久久精品| 色综合久久天天综合网 | 精品无码久久久久久久动漫 | 欧美黄色一级 | 国产综合精品 | 亚洲高清久久 | 日韩在线精品视频 | 欧美日韩三区 | 欧美日韩精品在线观看 | 日产精品一区二区三区在线观看 | 亚洲国产精品久久久 | 成人国产精品免费观看 | 国产精品久久久久久久久免费高清 | 日韩视频在线免费播放 | 国产乱码精品一区二区三区中文 | 精品国产乱码久久久久久丨区2区 | 日本天天操| 午夜社区 | 狠狠操综合网 | 国产一区二区三区视频在线观看 | 91黄色免费视频 | 日本不卡一区二区三区在线观看 | 日本三级中文在线电影 | 亚洲一区视频网站 | 瑟瑟视频网站 | 久久久精品网站 | av一区二区在线观看 |