一个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 ...
随机推荐
- leecode刷题(21)-- 删除链表的倒数第N个节点
leecode刷题(21)-- 删除链表的倒数第N个节点 删除链表的倒数第N个节点 描述: 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2- ...
- python爬虫的页面数据解析和提取/xpath/bs4/jsonpath/正则(1)
一.数据类型及解析方式 一般来讲对我们而言,需要抓取的是某个网站或者某个应用的内容,提取有用的价值.内容一般分为两部分,非结构化的数据 和 结构化的数据. 非结构化数据:先有数据,再有结构, 结构化数 ...
- 记一次MBR锁机病毒分析
有一天,在机缘巧合之下我获得了一个锁机软件(是多巧合阿喂!),然后兴高采烈的把它拖入了虚拟机里蹂躏(>_<!). 很巧,软件有虚拟机检测... Emmmm好吧,随便过一下... 我用的虚拟 ...
- html基础整理(01居中 盒子问题)
01 文字居中 将一段文字置于容器的水平中点,只要设置text-align属性即可: text-align:center; 02 容器水平居中 先为该容器设置一个明确宽度,然后将margin的水平 ...
- 在linux云服务器上运行Jar文件
在linux服务器上运行Jar文件时通常的方法是: $ java -jar test.jar 这种方式特点是ssh窗口关闭时,程序中止运行.或者是运行时没法切出去执行其他任务,有没有办法让Jar在后台 ...
- python3+requests:post请求四种传送正文方式(详解)
前言:post请求我在python接口自动化2-发送post请求详解(二)已经讲过一部分了,主要是发送一些较长的数据,还有就是数据比较安全等,可以参考Get,Post请求方式经典详解进行学习一下. 我 ...
- Linux修改profile文件改错了,恢复的方法
Linux修改profile文件改错了,恢复的方法在改profile的时候,改出问题了,除了cd以外的命令基本都不能用了,连vi都不能用了,上网查了下,用export PATH=/usr/bin:/u ...
- Codeforces Round #555 (Div. 3) C2. Increasing Subsequence (hard version)【模拟】
一 题面 C2. Increasing Subsequence (hard version) 二 分析 需要思考清楚再写的一个题目,不能一看题目就上手,容易写错. 分以下几种情况: 1 左右两端数都小 ...
- thinkphp5.0 微信扫码支付模式二
仅供个人参考,方便大家. 一.1)https://pay.weixin.qq.com/index.php/core/home/login 复制此地址 打开微信商户平台. 2)下载安全操作证书(最好在 ...
- HBase 使用外部的 zookeeper
HBase 启动时,默认会根据hbase-site.xml文件中的如下设置端口上启动一个zookeeper服务: <property> <name>hbase.zookeepe ...