一个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刷题(19)-- 最长公共前缀
leecode刷题(19)-- 最长公共前缀 最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: [&quo ...
- Python(简单计算器)
参考:https://www.cnblogs.com/alex3714/articles/5169958.html import re ret = re.search('\([^()]+\)','(1 ...
- DC010的精华分享【首发速看】
世界黑客大会[DC010] 是全球安全圈最神秘.最前沿的黑客大派对 而作为中国首个受DEFCON授权支持成立的 地区性 信息 安全 技术交流平台 DEFCONGROUP 010(DC010) 在国内 ...
- java使用Redis2--保存对象
Redis中并没有提供set(String key, Object obj)的方法,但提供了set(final byte[] key, final byte[] value) 的方法,可以通过把对象转 ...
- spring管理hibernate session的问题探究
我们再用spring管理hibernate的时候, 我们会继承HibernateDaoSupport 或者HibernateTemplate类. 我们不知道这两个类之间有什么关系. 也没有去关闭ses ...
- Windows文件共享,报错"该用户已禁用"解决方案
文章背景:学校机器有俩个用户think和adminsitrator.默认administrator禁用,think属于administrators组. 经排错得问题出现情况.因为同学们都是Think用 ...
- 基本项目框架搭建 sqlserver druid配置
1. 我的连接池采用的是阿里云的druid的连接池,工具是IDEA 框架是springboot+maven 以下是我的项目框架结构 2. pom 中配置 <?xml version=&quo ...
- 通过API方式查看Azure Sign-ins记录
经确认,目前Sign-ins功能在中国区还没有开通.也没有相关的预计开通时间.您可以通过如下链接随时关注China Azure的最新公告:https://www.azure.cn/zh-cn/what ...
- CUDA安装
1.CUDA是什么? CUDA(Compute Unified Device Architecture),显卡厂商NVidia推出的运算平台. 随着显卡的发展,GPU越来越强大,而且GPU为显示图像做 ...
- Oracle 11g
Oracle 11g 第一章 Oracle 11g数据库简介 1.1 认识Oracle11g Oracle 11g是Oracle 数据库最新的版本,目前已经被企业广泛的应用. 1.2 Oracl ...