一个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"这样
一个JNI的helloworld小demo的更多相关文章
- 实现一个servlet的helloworld小程序(不适用Eclipse)
实现一个servlet的helloworld小程序(不适用Eclipse) 1. 在tomcat中的webapps下建一个应用程序FirstServlet(C:\tomcat\webapps\Firs ...
- Swift基础之实现一个镂空图片的小Demo
前两天看了别人的文章,涉及到了镂空的展示,所以我在这里把实现的内容写成Swift语言的小Demo,供大家欣赏 首先,需要创建导航视图,然后创建两种展示方式的按钮 let vc = ViewContro ...
- iOS:自己写的一个星级评价的小Demo
重新整理了下自己星级评价的Demo,可以展示星级评价,可以动态修改星级. github的地址:https://github.com/hunterCold/HYBStarEvaluationView a ...
- 一个基于node 的小demo
首先我们新建一个文件夹 demo-test-node-1 目录目录如下 -- blog_recents.js --template.html --titles.jspn 首先我们新建一个 templ ...
- gulp安装+一个超简单入门小demo
gulp安装參考.gulp安装參考2. 一.NPM npm是node.js的包管理工具.主要功能是管理.更新.搜索.公布node的包. Gulp是通过npm安装的. 所以首先,须要安装node.js. ...
- SpringMVC-拦截器做一个登录认证的小Demo
拦截器 拦截器的定义 处理器拦截器类似于servlet开发中的filter,用于对处理器进行预处理和后处理. 定义拦截器,实现HandlerInterceptor这个接口 接口的实现需要导入包impo ...
- 一个搜索框的小demo
一.实时按照输入的搜索值显示与其匹配的内容,隐藏其它内容 <%@ Page Language="C#" AutoEventWireup="true" Co ...
- Android学习小Demo一个显示行线的自定义EditText
今天在处理一个EditText的时候,想着把EditText做成像一本作业本上的纸一样,每一行都可以由线条隔开,具体效果如下: 1)最开始的思路 一开始的想法是很简单的,找出每一行的高度,然后一行一行 ...
- 用idea搭建一个简单的SSM的Demo
1.新建一个maven web app项目 结构如下 resources的资源文件如下 applicationContext.xml 的配置 <?xml version="1.0&q ...
随机推荐
- FutureTask与Fork/Join
在学习多线程的过程中,我们形成了一种思维习惯.那就是对于某个耗时操作不再做同步操作,让他分裂成一个线程之后执行下一步,而线程执行耗时操作.并且我们希望在我们需要它返回的时候再去调用它的结果集.好比我们 ...
- 使用sqlyog将sql server 迁移到mysql
使用软件工具sqlyog(64位) sqlyog 迁移步骤 1.使用sqlyog连接目标数据库 连接目标数据库 2.选择目标数据库(需要先把表结构建好,从SQL Server同步表结构也可以使用工具, ...
- 【VS2015】关于VS2015如何运行的问题
各位看官,lt's been a long time since we met last time. 是否习惯了CodeBlocks那种简易编写C文件?一到写工程就懵逼的状态?今天我给他们带来如何让C ...
- 基础概念——令人迷惑的EOF
EOF概念常常使人迷惑. 首先我们要理解并没有像EOF字符这样的东西. 进一步讲EOF是由内核检测到的一种条件. 应用程序在它接收到由read函数返回的零返回码时,它就会发现EOF条件. 对于磁盘文件 ...
- 北航操作系统实验2019:Lab4-1流程梳理
北航操作系统实验2019:Lab4-1流程梳理 前言 操作系统的实验课实在令人头秃.我们需要在两周时间内学习相关知识.读懂指导书.读懂代码.补全代码.处理玄学bug和祖传bug,以及回答令人窒息的思考 ...
- 2018徐州网络赛 - Trace
题意:n个左下角为原点右上角在第一象限的矩形不断覆盖,求最后形成的图形的周长 x和y是独立的,分别维护两棵线段树,一棵表示x坐标下最大的y值,另一棵表示y坐标下最大的x值 从覆盖的角度来考虑,如果逆序 ...
- Maven 安装jar文件到本地repository
Reference: https://maven.apache.org/general.html#importing-jars mvn install:install-file \ -Dfile=&l ...
- 完全国人自主研发原创的智能软件路由器BDS即将发布,附带企业服务总线ESB功能
完全国人自主研发原创的智能软件路由器即将发布: 完全国人自主研发原创的智能软件路由器BDS即将发布,附带企业服务总线ESB功能 智能软件路由器 BDS 简要介绍 http://kan.weibo.co ...
- hibernate关联关系的crud2
hibernate关联关系的CRUD操作,解释都在注释里了,讲了fetchType.cascade. User类: package com.oracle.hibernate; import javax ...
- hibernate基本配置
将讲解表名类名不一致.属性名列名不一致.不持久化某属性.Date类型的注解.枚举类型的注解(枚举类型在xml配置有点麻烦不说了),说明都在代码注释里. 项目目录: 注解方式以Teacher类为例,xm ...