一键生成JNI头文件方法二

经常使用java的同学一定都接触过JNI(Java Native Interface)吧。JNI为我们提供了java<---->C/C++之间的接口,使得我们可以在java中调用C程序,以便实现一些计算复杂度较高的程序(如图像处理、信号处理等)。另外,也方便我们使用很多优秀的C库。

使用javah生成本地方法头文件

JNI怎么使用在这里我就不介绍了。今天主要来说一下JNI的本地方法头文件如何生成,以及怎么方便地在eclipse中一键生成。当你使用JNI时,需要在你的java程序中声明一个类,并且用native关键字来表明该类中的方法是使用本地方法(一般是C/C++)实现的。比如下面给出了一个简单的例子:

package com.jni.test;

public class Example {

public native String jni_test();
 
 static {
  System.loadLibrary("Example");
 }
}

这里定义了一个本地方法jni_test,该方法返回一个String。其中System.loadLibrary是用来加载本地库的(dll或者so)。

有了这个类以后,就可以调用javac命令编译,得到Example.class文件,然后就可以使用编译好的.class文件生成文件了。

在java中,提供了javah这个命令来生成本地方法的头文件。使用命令如下:

javah -classpath A -d B -jni C

其中,A是你的.class文件的路径,这样java就可以搜索到这个.class文件。B是将要生成的头文件的存放目录,可以根据需要指定。C是java类名,在这个例子中就是com.jni.test.Example。然后就可以在B目录下看到生成的头文件了。

在eclipse中一键调用javah自动生成文件

可是,这样不是有些麻烦吗???

可不是嘛,有了.class后还要在命令行里敲入javah那一串命令,对刚刚在eclipse中定义了本地方法的开发者来说显得过于繁琐了。如果能够在eclipse中定义好本地方法后,直接生成相应的头文件,那该多方便啊。别急,我这里就介绍一个方法。

首先在eclipse中点击下图图标的下拉菜单

然后点击External Tools Configurations

会弹出下面的页面,然后在那3个地方分别填入下图中的命令

其实,这里的操作就是把javah这个可执行程序当做外部工具引入eclipse中来了。调用的时候,eclipse就会执行javah,并且使用预设的arguments,即:

javah -classpath .;./classes -d "${project_loc} -jni ${java_type_name}"

可以看到,.class文件的搜索目录是当前工作目录和子目录classes(android开发时生成的.class是在classes这个子目录中,所以这里也加了这个目录,如果你不搞android开发,那不加这个目录也没关系)。当前工作目录就是上面设好的${project_loc}/bin,也就是你这个java工程的bin文件夹。这样javah就可以在该目录下找到本地方法的.class文件。-d "${project_loc}"是为了让生成好的.h头文件直接被放置在java工程目录下,便于后续操作。 最后的${java_type_name}是动态的参数,你在生成.h头文件之前先在eclipse中选中本地方法那个java文件,这样java_type_name就自动变成了这个本地方法的名字。

设置好以后,我们来试着生成一下头文件,先在eclipse中选中刚刚定义好的本地方法Example.java,然后点击下图中的位置来调用javah这个外部工具,就可以自动生成文件了(需要在当前工程中刷新一下才能看到)。

这样设置好以后,将来各位同学在需要生成文件时,只需写好本地方法的java类,然后鼠标点击一下就能够自动生成文件了,是不是很方便啊。

这篇日志就到这里,我们下文再见~~~

时间: 2024-08-14 01:18:21

一键生成JNI头文件方法二的相关文章

Javah生成JNI头文件方法

(1)javac编译技巧 自动生成包目录 javac -d . *.java 自然生成带包的文件了 (2)javah使用生成c头文件 java public class HelloJNI { public native void hello(int i ); } 命令中执行 -bash-4.1# pwd/home/jni-bash-4.1# lsHelloJNI.java-bash-4.1# more HelloJNI.java package com.venustech.jni; public

linux中如何使用javah命令生成jni头文件

平台:瑞芯的rk3288 SDK:5.1 作者:fulinux 笔记用内容,可能不全 *****本文允许转载,不过请注明出处:http://blog.csdn.net/fulinus**** java程序 rk3288/frameworks/base/media/java/android/media/MediaScanner.java 文件中class 为public class MediaScanner 正常编译后会在rk3288/out/target/common/obj/JAVA_LIBR

[转]ubuntu下整合eclipse和javah生成jni头文件开发android的native程序

转载自:http://blog.csdn.net/jiuyueguang/article/details/9404237 本文介绍两种利用javah命令生成jni头文件的方法,第一种为大众所知的javah命令,第二种为整合javah到eclipse里面.推荐第二种方式,方便快捷,随时修改随时生成 0:前提和条件: 1:ubuntu64位系统 2:android-ndk-r8e已经安装好,并且配置到eclipse里面 3:android-sdk-linux已经安装好,并且配置到eclipse里面

ubuntu下整合eclipse和javah生成jni头文件开发android的native程序(转)

本文介绍两种利用javah命令生成jni头文件的方法,第一种为大众所知的javah命令,第二种为整合javah到eclipse里面.推荐第二种方式,方便快捷,随时修改随时生成 0:前提和条件: 1:ubuntu64位系统 2:android-ndk-r8e已经安装好,并且配置到eclipse里面 3:android-sdk-linux已经安装好,并且配置到eclipse里面 1:第一种命令行模式 1:如图,我的项目结构是这样,我的 如图,采用eclipse自动生成的jni文件夹中,可以看到And

javah生成jni头文件时报错 Error: cannot access android.support...

javah生成jni头文件时报错: Error: cannot access android.support.v7.app.AppCompatActivity class file for android.support.v7.app.AppCompatActivity not found Error: cannot access android.support.v4.app.FragmentActivity class file for android.support.v4.app.Fragm

【转】Android NDK学习(3)使用Javah命令生成JNI头文件 .

第一步: 在Eclipse中创建android项目,并声明Native接口: public native int add (int a, int b);public native int sub (int a, int b); 编译.运行: 这样在bin目录下就会生成类文件: 第二步: 打开命令行cmd,到达bin目录: F:\fww\workspace\TestJNI\bin> 输入如下命令: F:\fww\workspace\TestJNI\bin>javah -d header -cla

使用javah生成jni头文件

用法:javah [选项] <类> 其中 [选项] 包括: -help 输出此帮助消息并退出 -classpath <路径> 用于装入类的路径 -bootclasspath <路径> 用于装入引导类的路径 -d <目录> 输出目录 -o <文件> 输出文件(只能使用 -d 或 -o 中的一个) -jni 生成 JNI样式的头文件(默认) -version 输出版本信息 -verbose 启用详细输出 -force 始终写入输出文件 这里执行程序老

android studio下生成jni头文件

cd app/src/main javah -d jni -classpath ../../build/intermediates/classes/debug net.sourceforge.lame.Lame 头文件 net_sourceforge_lame_Lame.h 会放在app/src/main/jni目录下

C++生成简单WAV文件(二)

既然生成声音已经没问题了,现在简单生成一下一个类似蜂鸣器的随机音乐文件.(注:可能书写有格式不正式之类问题,反正思路应该没问题,测试可以运行) 因为是随机,那么先弄个产生随机数的类 R.H和R.CPP R.H: #ifndef R_H_ #define R_H_ class R{ public: R(); int suiji(int i); int suiji(); private: int shuchu(int number); }; #endif /* R_H_ */ R.cpp: #inc