澳门新葡亰娱乐网站-www.142net-欢迎您

澳门新葡亰娱乐网站是因为你还没有找到一条正确的致富之路,www.142net是将所有的游戏都汇集在一起的官方平台,因为澳门新葡亰娱乐网站这个网站当中有着大量的游戏攻略,托IP定位技术,传达终端直接到达的精准传播方式。

手把手教你通过Eclipse工程配置调用JNI完全攻略,

来源:http://www.bhtsgq.com 作者:计算机知识 人气:94 发布时间:2019-05-30
摘要:粗略计划干活: 以下具体操作方法能够直接百度,答案大致是举世无双可信赖的。 设置JDK,配置系列情状变量 计划好3个带CDT插件的Eclipse,笔主使用的是google的ADTBundle,自带了CDT,对

粗略计划干活:

以下具体操作方法能够直接百度,答案大致是举世无双可信赖的。

  1. 设置JDK,配置系列情状变量
  2. 计划好3个带CDT插件的Eclipse,笔主使用的是google的ADT Bundle,自带了CDT,对应Eclipse 叁.八.0版
  3. 下载二个MinGW(免费的C/C 等语言编写翻译器套件),笔主限于公司垃圾网络,测试时接纳mingw-offline-install-二零一二04二陆v肆.6.二版,安装时仅需勾选(在线安装版下载数据量约50Mb):
  • C Compiler
  • C Compiler
  • MinGW Developer Toolkit (Indudes MSYS Basic System)

 

一、盘算职业:安装JRE和JDK。

Step 1: Create a Java Project

Create a new Java project (says HelloJNI), and the following Java class "HelloJNI.java":

public class HelloJNI {
   static {
      System.loadLibrary("hello"); // hello.dll (Windows) or libhello.so (Unixes)
   }

   // Declare native method
   private native void sayHello();

   // Test Driver
   public static void main(String[] args) {
      new HelloJNI().sayHello();  // invoke the native method
   }
}

新近因为项目原因需求运用到JNI,可是找了下英特网,我们的都档期的顺序不齐,有的是3一个人的操作系统,也不太相符本人的必要,所以,在此写下留个回忆,小说虽短,依然走了好些个的坑路,然后总计出来的,希望我们多多辅助啦.

配置MinGW的情况变量:

  1. 张开碰到变量(系统变量),增多 MINGW_HOME 变量,变量值是刚才MinGW的设置地方,如 D:Program FilesMinGW
  2. 安装path变量,编辑path变量添加%MINGW_HOME%bin;%MINGW_HOME%msys1.0bin;
  3. 添加 LIBRARY_PATH 变量,变量值 %MINGW_HOME%lib
  4. 添加 C_INCLUDE_PATH 变量,变量值 %JAVA_HOME%include;%JAVA_HOME%includewin32;%MINGW_HOME%include
  5. 添加 CPLUS_INCLUDE_PATH 变量,内容 %JAVA_HOME%include;%JAVA_HOME%includewin32;%MINGW_HOME%手把手教你通过Eclipse工程配置调用JNI完全攻略,手把手教新手安装Eclipse。libgccmingw324.5.2includec
  6. Win7点击鲜明后马上生效,若未见效请重启系统(参考安装JDK时布署操作)

第四、5步额外增多的%JAVA_HOME%include;%JAVA_HOME%includewin3贰;是为着让eclipse在c/c 项目中自动引入那么些目录下的各个头文件,举例 jni.h,也可在实际项指标性质中以下职责打开点名:

 澳门葡京现金游戏开户 1

 

姓名分别为:Java Runtime Environmen和Java SE Development Kit,推荐直接在某度软件基本下载即可,注意区分六十六个人和三10位。

Step 2: Convert the Java Project to C/C Makefile Project

Right-click on the "HelloJNI" Java project ⇒ New ⇒ Other... ⇒ Convert to a C/C Project (Adds C/C Nature) ⇒ Next.
The "Convert to a C/C Project" dialog appears. In "Project type", select "Makefile Project" ⇒ In "Toolchains", select "MinGW GCC" ⇒ Finish.
Now, you can run this project as a Java as well as C/C project.

文中提到到类加载器的利用,感兴趣的能够百度只怕谷歌(Google)一下,本文就不开始展览详尽描述了.

调用JNI全过程:

始建一个常备java工程 Test,加多八个特意担任引进调用本地库的类 Native,代码如下:

澳门葡京现金游戏开户 2

1 public class Native {
2     // 声明自定义本地库方法接口
3     native public static void run();
4     
5     // 自动加载本地库文件,如文件名全称为 myCLib.dll
6     static{
7         System.loadLibrary("myCLib");
8     }
9 }

澳门葡京现金游戏开户 3

 

开发CMD....好呢,笔主认同标题党了,整个博文仅此壹处须求一句简单的指令! CMD导航至项目文件夹下的 src 目录,输入 javah test.Native澳门葡京现金游戏开户,(必要运用包名.类名的一体化限定名称),生费用地点法接口头文件 test_Native.h

澳门葡京现金游戏开户 4

 

刷新eclipse的 Package Explorer 应该会产生那样的目录状态,当中刚才刚才生成的 test_Native.h 文件代码如下图示(笔主抢闸成立了Test类,稍候用于调用Native类的当位置法):

澳门葡京现金游戏开户 5

 

 

创制一个新的 C 工程 MyC,期待编译成dll的时候,采用 Shared Library 下的模板:

澳门葡京现金游戏开户 6

澳门葡京现金游戏开户 7

 

 在 MyC 工程内创设3个文本夹 src ,并将刚才 Test 项目中变化的 test_Native.h 头文件拷贝(或瓜分)到 MyC 工程的 src 文件夹下,Test 工程下的 test_Native.h 文件在背后的门类运作进度少将不再起任何意义,可删:

澳门葡京现金游戏开户 8

 

*  打开 MyC 工程下的 test_Native.h ,若 #include <jni.h> 提示 Unresolved inclusion: <jni.h> 的错误警告(如下图所示),则表利尿前以此C项目未有一些名 jni.h 的头文件地方,仿效上文 配置MinGW的条件变量 的第肆、伍步举行陈设:

澳门葡京现金游戏开户 9

 

 **  MyC 工程文件中接口函数代码上提醒的 Syntax error 能够有的时候忽略,据闻是eclipse语法检验的三个bug:

 澳门葡京现金游戏开户 10

 

 在 MyC 工程 src 文本夹中,新建三个C的落实类 NativeC.c ,引进接口头文件 jni.htest_Native.h ,并编写制定接口函数 JNICALL Java_test_Native_run 的兑现(函数接口直接从 test_Native.h 中总体拷贝过来,注意加上形参):

澳门葡京现金游戏开户 11

1 #include <jni.h>
2 #include "test_Native.h"
3 #include <stdio.h>
4 
5 JNIEXPORT void JNICALL Java_test_Native_run
6   (JNIEnv *env, jclass clazz){
7     puts("Hello JAVA, I am C.");
8 }

澳门葡京现金游戏开户 12

 

那时工程看起来应当是那样子的:

澳门葡京现金游戏开户 13 

 

 

出于采纳 minGW 暗许生成的 dll 函数签字带有 @ 分隔符,将变成后边JNI调用时爆发 java.lang.UnsatisfiedLinkError: xoxoclass.xoxomethod() 错误,因而必要奉行以下步骤解决多余的 @ 符号。

配置 MyC 工程: MyC 工程上右键菜单 Properties ,右侧选择C/C Build -> Settings ,右边 Configuration 中显得的为最近正在呈现的编写翻译模板,[ Active ] 表示通过 Project->Build Project 菜单编写翻译时选拔的暗中同意编写翻译版本, minGW 将基于那些模板的性质设置,编写翻译生成多套版本的 dll 或 exe ,有洁癖的同学可通过最左侧的 Manage Configurations... 按键增加和删除编译模板:

澳门葡京现金游戏开户 14

 

为了相比较效果,笔主决定增添1套新模板 ReleaseNoAt ,承接暗中认可的 Release 模板属性参数,并安装为Active,决不是因为洁癖或什么离奇的开始和结果:

澳门葡京现金游戏开户 15  澳门葡京现金游戏开户 16

 

OK重返刚才的编译模板属性配置分界面,在 ReleaseNoAt 模板下,Tool Settins 页中的 MinGW C Linker -> Miscellaneous ,Linker flags 框中输入 -Wl,--kill-at,点击最下方的 Apply:

澳门葡京现金游戏开户 17

 

点击 MinGW C Linker ,展现的参数结果应当是那般的:

澳门葡京现金游戏开户 18

 

要是此前创建的C工程不是应用 Shared Library 模板,并且默许编写翻译出的不是 dll 文件,能够在此选取 Build Artifact 页进行修改配置,Artifact Type 中挑选 Shared Library ,Artifact extension 中选择 dll 就能够,Output prefix 可钦命输出 dll 文件的命名前缀:

澳门葡京现金游戏开户 19

 

OK鲜明重回代码编辑分界面,在 MyC 工程上右键菜单,Build Configurations->Build All,生成全体模板的dll文件版本:

澳门葡京现金游戏开户 20

 

各版本 dll 如下图所示,调整台中得以见见每一个 dll 生成所用的下令参数(今后来得的是 ReleaseNoAt 本子,即唯壹配置了去掉@符号的沙盘):

澳门葡京现金游戏开户 21

 

为了验证暗中认可 Release 与 ReleaseNoAt 版本的不一致,可用 dllexp 那一个工具展开那两个dll 文件实行查看(具体方法不告诉您):

Release版(上边那么些 @8 便是全部劳动的首恶祸首)

澳门葡京现金游戏开户 22

 

ReleaseNoAt版(干净了)

澳门葡京现金游戏开户 23

 

回到eclipse,在 Test 工程中新建文件夹 dll (命名随便),并将方面生成的 ReleaseNoAt版 libMyC.dll 拷贝到那么些dll文件夹中,重命名称为 myCLib.dll(因为上文 Native类 中通过 System.loadLibrary("myCLib"); 加载了那个名字的dll文件,当然你也足以修改代码变成System.loadLibrary("libMyC"); 来代替重命名),此后 MyC 工程将不再起任何成效,可删:

澳门葡京现金游戏开户 24

 

配置 Test工程 属性,内定工程的地面库目录,直接看图:

澳门葡京现金游戏开户 25

 

Test工程 test包中新建 Test类 (由于岁月涉及,笔主已经先行偷偷违反规章制度的建筑了),在main方法中引用 Native类 的本地点法run():

1 public class Test {
2 
3     public static void main(String[] args) {
4         Native.run();
5     }
6 }

澳门葡京现金游戏开户 26

 

终极一步,运维起来...好呢,下面已经偷跑了,最后结果如上海体育场所所示,Hello, I am Wavky.

下载时,提议不需要修改暗许安装地方,要是改动了,请牢记那几个任务。

Step 3: Generate C/C Header File

Create a directroy called "jni" under the project to keep all the C/C codes, by right-click on the project ⇒ New ⇒ Folder ⇒ In "Folder name", enter "jni".
Create a "makefile" under the "jni" directory, by right-click on the "jni" folder ⇒ new ⇒ File ⇒ In "File name", enter "makefile" ⇒ Enter the following codes. Take note that you need to use tab (instead of spaces) for the indent.

# Define a variable for classpath
CLASS_PATH = ../bin

# Define a virtual path for .class in the bin directory
vpath %.class $(CLASS_PATH)

# $* matches the target filename without the extension
HelloJNI.h : HelloJNI.class
    javah -classpath $(CLASS_PATH) $*

This makefile create a target "HelloJNI.h", which has a dependency "HelloJNI.class", and invokes the javah utiltiy on HelloJNI.class (under -classpath) to build the target header file.
Right-click on the makefile ⇒ Make Targets ⇒ Create ⇒ In "Target Name", enter "HelloJNI.h".
Run the makefile for the target "HelloJNI.h", by right-click on the makefile ⇒ Make Targets ⇒ Build ⇒ Select the target "HelloJNI.h" ⇒ Build. The header file "HelloJNI.h" shall be generated in the "jni" directory. Refresh (F5) if necessary. The outputs are:
make HelloJNI.h
javah -classpath ../bin HelloJNI

留意:本文全体的利用的都是陆13个人

官方网址下载速度会异常慢,并不引入,自闭症及网络畅通者无视那句话,并依据此链接下载:

Step 4: C Implementation - HelloJNI.c

怎么样搜索apt安装的文书安装路线?

澳门葡京现金游戏开户 27

有图有真相

which java
ls -lrt /usr/bin/java
ls -lrt /etc/alternatives/java
cd /usr/lib/jvm
ls

里面,/usr/lib/jvm/java-八-oracle/include表示头文件jni.h的八方路线,/usr/lib/jvm/java-八-oracle/include/linux表示头文件jni_md.h所在的路线,/usr/lib/jvm/java-8-oracle表示JDK的装置目录

target 已经济建设立了如何做?right click--》build--》remove。
又有任何主题素材了。
--add-stdcall-alias是[minGW]特有的,删除。
或许不对
据此,看一下makefile到底是怎么东西
target 也便是一个发令,build也正是推行这些命令。
clean target正是破除HelloJNI.h HelloJNI.o hello.dll,build就足以成功命令。
近来先去学一下makefile。开端学习makefile,回过头来看这么些makefile文件。知道makefile文件的情致只是要从头来理清。
makefile的目的正是生育动态库函数。然后,这么些java class就足以被调用了。难题是怎么写这一个makefile?

  • 在step三中,用了makefile便宜HelloJNI.h。成功的。看看她的语法。
  • CLASSPATH=.:/bin 设置条件变量CLASSPATH的值为当前目录及/bin目录及/bin目录。 =号后边的 . 是指当前目录,:是分开符号,/bin是指根目录下的bin目录
  • $cd ../bin是到上级目录的bin文件夹下.
  • linux中PATH=$PATH:$HOME/bin是什么意思: 1. ":"代表分隔符. 2. [PATH]=$[PATH]:$[HOME]/[bin]表示在PATH情况变量中追加 $[HOME]/[bin] 那些目录

综上,CLASS_PATH = ../bin set CLASS_PATH = 上级目录的bin文件夹下. 那自个儿就可以想见,指的是HelloJNI.class文件,因为bin里面唯有这么些文件。是输入文件。

CLASS_PATH = ../bin //上级目录的bin文件夹下
vpath %.class $(CLASS_PATH) //指定.class类型文件的搜索路径是 $(CLASS_PATH)就是../bin
HelloJNI.h : HelloJNI.class
    javah -classpath $(CLASS_PATH) $*

HelloJNI.h : HelloJNI.class
    javah -classpath $(CLASS_PATH) $*
//指的是一条规则,目标是HelloJNI.h文件,依赖是HelloJNI.class文件。命令是`javah -classpath $(CLASS_PATH) $*`。 
//`javah` 是制作头文件的命令,`-classpath`是设置路径的参数,后面跟路径,所以`$(CLASS_PATH) $*`代表路径和具体的依赖名。
//我觉得`$(CLASS_PATH)`表示路径,就相当于`../bin`,`$*`表示去掉后缀".class"的所有文件。

Java中-classpath和路线的应用
javac:如若当前您要编写翻译的Java文本中援引了别的的类(譬喻说:继承),但该引用类的.class文件不在当前目录下,这种境况下就需求在javac命令后边加上-classpath参数,通过利用以下三种档期的顺序的艺术 来指点编写翻译器在编译的时候去钦命的门道下找寻引用类。
(一).相对路径:javac -classpath c:/junit叁.八.1/junit.jar Xxx.java
(2).相对路线:javac -classpath ../junit3.8.1/Junit.javr Xxx.java
(叁).系统变量:javac -classpath %CLASSPATH% Xxx.java (注意:%CLASSPATH%象征使用系统变量CLASSPATH的值举行检索,这里如若Junit.jar的不二等秘书籍就富含在CLASSPATH系统变量中)

  • 在step四中,供给修改makefile文件,来生成三个共享的dll库函数。在Linux下,应该是so文件。website
    新民主主义革命表示要修改的地点。如下:
all : hello.dll
 # $@ matches the target, $< matches the first dependancy
hello.dll : HelloJNI.o
    gcc -Wl,--add-stdcall-alias -shared -o $@ $<
 # $@ matches the target, $< matches the first dependancy
HelloJNI.o : HelloJNI.c HelloJNI.h
    gcc -I"D:binjdk1.7include" -I"D:binjdk1.7includewin32" -c $< -o $@
clean :
    rm HelloJNI.h HelloJNI.o hello.dll #最简单,没有依赖,目标不是文件是空置(状态),命令是rm就是删除,注意。dll应改为so。
  1. “libhello.so”
  2. “#”表示注释
 # Define a variable for classpath
CLASS_PATH = ../bin
 # Define a virtual path for .class in the bin directory
vpath %.class $(CLASS_PATH)

all : libhello.so

# $@ matches the target, $< matches the first dependancy
libhello.so : HelloJNI.o
    gcc -o libhello.so -shared HelloJNI.o

# $@ matches the target, $< matches the first dependancy
HelloJNI.o : HelloJNI.c HelloJNI.h
    gcc -fpic -I/usr/lib/jvm/java-8-oracle/include -I/usr/lib/jvm/java-8-oracle/include/linux -c HelloJNI.c -o $@
# $* matches the target filename without the extension
HelloJNI.h : HelloJNI.class
    javah -classpath $(CLASS_PATH) $*

clean :
    rm HelloJNI.h HelloJNI.o libhello.so

gcc安装

1.下载并进行安装https://sourceforge.net/projects/mingw-w64/2.进入并进行选择安装,可以参考下面这篇文章进行安装https://jingyan.baidu.com/article/19192ad816ea01e53e570730.html3.配置环境变量在path里面加入如下参数即可,我的安装目录是在 E:mingw64E:mingw64mingw64bin;4.查看是否安装成功gcc -v

Java Runtime Environmen(官网)和Java SE Development Kit(官方网址),请小心区分Computer体系以及60人(X6肆)和三拾陆个人(X86)。

step 5 Run the Java JNI Program

  • You can run the Java JNI program HelloJNI. However, you need to provide the library path to the "hello.dll". This can be done via VM argument -Djava.library.path.
  • Right-click on the project ⇒ Run As ⇒ Run Configurations ⇒ Select "Java Application"(双击new) ⇒ In "Main" tab, enter the main class "HelloJNI" ⇒ In "Arguments", "VM Arguments", enter "-Djava.library.path=jni" ⇒ Run.
  • You shall see the output "Hello World!" displayed on the console.
![](https://upload-images.jianshu.io/upload_images/1456994-f040a420be02f2d4.png)

Hello World!
  1. ECLIPSE CDT & JNI (JAVA NATIVE INTERFACE) WITH 64 BIT MINGW - 2017
  2. 轻便使用Eclipse CDT进行Java JNI编制程序

jdk安装

对此开辟java的人来讲,应该都以部分吧,只是自身的jdk版本是1.8 64位的

澳门葡京现金游戏开户 28image.png

澳门葡京现金游戏开户 29

end

开垦工具

IDEA

壹.创办项目名JNI

二.档期的顺序结构

澳门葡京现金游戏开户 30image.png

3.编写HelloWorld

 package com.wanggan.jni; /** * @author wanggan */ public class HelloWorld { public native void displayHelloWorld(); static { System.loadLibrary; } public static void main(String[] args) { new HelloWorld().displayHelloWorld(); } }

1.使用javah成立头文件在src目录下选取如下命令javah com.wanggan.jni.HelloWorld,此时,在src文件夹下边会生成二个com_wanggan_jni_HelloWorld.h的文件

2.创建.c文件

将上面的`.h`文件可以拷贝出来,然后创建一个文件夹并放在下面(例如文件夹叫demo),并创建一个文件叫`com_wanggan_jni_HelloWorldImpl.c`,结构为:

澳门葡京现金游戏开户 31image.png

`com_wanggan_jni_HelloWorldImpl.c`内容为:#include "jni.h"#include "com_wanggan_jni_HelloWorld.h" JNIEXPORT void JNICALLJava_com_wanggan_jni_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj){ printf("this is c print content,it's magicn"); return;}可以看出,文件中调用了`jni.h`,并使用了创建出来的的`.h`文件

三.进展编译

`gcc -I %java_home%include -I %java_home%includewin32 com_wanggan_jni_HelloWorldImpl.c -shared -o hello.dll`说明: 1.`-I` 是指定加载这下面的预处理文件,因为需要使用到`jni.h`和`jni_md.h`,分别可以在这两个下面找到,2.`hello.dll`即是java中`System.loadLibrary;`调用的库文件名称,3.此时文件夹下面生成了一个叫`hello.dll`文件

四.将编写翻译好的.dll文件放到项目根目录下就能够

5.在调控台或编辑器举办实行

编辑器:

在编辑器中执行一般都不会报错,如果报错,可以设置下vm参数,`-Djava.library.path=你的项目根路径`

控制台:

1.控制台在src文件夹下面执行命令`javac comwangganjniHelloWorld.java`,2.再进行执行`java com.wanggan.jni.HelloWorld`3.控制台会报错,因为加载器默认加载的是`java.library.path`,因为dll文件不在那个环境变量目录下,此时我们可以指定`java.library.path`,4.我们可以在根目录下面创建一个dll文件夹,将生成的dll文件放到这个文件夹下面,然后再执行`java -Djava.library.path="E:IDEA PROJECTJNIdll" com.wanggan.jni.HelloWorld`

6.实施结果截图

澳门葡京现金游戏开户 32image.png

因为不是平常看,所以请在上面展开留言,看到后会尽快还原,多谢,就算文中有怎么样难堪的地点,麻烦我们协助提出,笔者回尽快优化并拓展整理.

终极,非常感激各位的协理.

 

二、境遇变量配置。

一、设置碰着变量。

本文由澳门新葡亰发布于计算机知识,转载请注明出处:手把手教你通过Eclipse工程配置调用JNI完全攻略,

关键词: 新莆京娱乐 JNI eclipse

最火资讯