• 一个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_HOMEjdk1.6.0_17includejni.h  ,JAVA_HOMEjdk1.6.0_17includewin32jni_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
    ", 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"这样

    遇事犹豫不决时,须持虎狼之心,行仁义之事
  • 相关阅读:
    JDK有关环境变量的配置
    installation Manager的那回事
    WMB ESQL报文函数截取新的XML方法
    mb常用操作指令
    DB2报错SQLSTATE=57017 code page "1392"
    DB2操作命令
    MQ7.1及高版本的新特性
    Java项目打jar包及外部运行
    loadrunner
    Ireport5那些事
  • 原文地址:https://www.cnblogs.com/fmlyzp/p/10392127.html
Copyright © 2020-2023  润新知