一个JNI的helloworld小demo

     最近想学习一下jni,在网上看了一些demo,自己也操作了一遍,首先我将我自己学习的demo网站贴出来:https://blog.csdn.net/lwcloud/article/details/78326903

         为了方便阅读我也将代码贴出来,这篇的主要目的是为了记录我在学习的时候遇到的坑,

       首先:java代码

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,文件内容如下

        

// 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文件

5.这一步就是将生成Helloworld.dill放到java工程的lib中,然后build path将lib配置成,native library目录,然后运行即可

上面是简单的步骤,下面来盘点一下我遇到的大坑,

 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"这样

猜你喜欢

转载自www.cnblogs.com/fmlyzp/p/10392127.html