最近想學習一下jni,在網上看了一些demo,本身也操做了一遍,首先我將我本身學習的demo網站貼出來:https://blog.csdn.net/lwcloud/article/details/78326903java
爲了方便閱讀我也將代碼貼出來,這篇的主要目的是爲了記錄我在學習的時候遇到的坑,c++
首先:java代碼app
package test; public class HelloWorld { //靜態代碼塊,加載c++dill文件 static { System.loadLibrary("HelloWorld"); } //構造方法 public HelloWorld() { } //定義方法 public native int init(int lPort); public native void print(String str); }
第二個是測試代碼,都比較簡單工具
package test; public class Test { public static void main(String[] args) { HelloWorld hw = new HelloWorld(); hw.print("Hello World!"); int number=hw.init(123); System.out.println(number); } }
值得一說的就是生成c++ 這一過程,首先我是學java的c++一竅不通,哈哈,花了幾個小時才安裝好軟件出現一個helloworld,學習
1.cd到工做空間的 src 目錄,使用javac命令編譯一下HelloWorld文件,而後 使用javah,命令生成一個HelloWorld.h文件,這個東西比較關鍵測試
2.新建一個c++,HelloWorld項目,主要是用來編譯生成dill文件的,咱們將HelloWorld.h文件,還有 JAVA_HOME\jdk1.6.0_17\include\jni.h ,JAVA_HOME\jdk1.6.0_17\include\win32\jni_md.h,這兩個文件一併放入工程中。網站
3.修改HelloWorld.cpp,文件內容以下ui
// HelloWorld.cpp : Defines the entry point for the DLL application. // #include "stdafx.h" #include "HelloWorld.h" /* * Class: HelloWorld * Method: init * Signature: (I)I */ JNIEXPORT jint JNICALL Java_HelloWorld_init(JNIEnv *env, jobject job, jint lPort){ int number=10; number+=lPort; return number; } /* * Class: HelloWorld * Method: print * Signature: (Ljava/lang/String;)V */ JNIEXPORT void JNICALL Java_HelloWorld_print(JNIEnv *env, jobject job, jstring str){ printf("%d\n", str); }
4.編譯,會在工程的debug文件夾中生成想要的Helloworld.dill文件spa
5.這一步就是將生成Helloworld.dill放到java工程的lib中,而後build path將lib配置成,native library目錄,而後運行便可.net
上面是簡單的步驟,下面來盤點一下我遇到的大坑,
1.最感人的就是,c++ 6.0生成的是 32位dill文件,你的jdk要是64位的那恭喜你,從新來吧,,換成vusial studio 2005,使用生成,從新弄成64位的,沒事加深一下印象,哈哈哈;
2.第二個就是工具的文件路徑問題,報的忘記記錄了,具體緣由是include 文件加配置的錯誤,須要在選項 ——目錄——s目錄——includeFile 裏修改一下
3.就是頭文件報錯,這個東西 #include "stdafx.h"必定要加,我沒學過c++,不瞭解太多就很少嗶嗶了,其中引用方式也特使#include "stdafx.h"表示在當前目錄中找,#include <stdafx.h>表示在整個庫中查找,這就要注意將helloworld裏的引用改一下#include "jni.h"這樣