Java applet & native method (JNI) -- Snippets

1. Java applet

>javac -d . HelloApplet.java

>appletviewer HelloApplet.html 

 或者直接用IE打开

//  HelloApplet.java
public   class  HelloApplet  extends  java.applet.Applet
{
    
public   void  paint(java.awt.Graphics g)
    {
        g.drawString(
" Hello Applet! " 50 25 );
    }
    
    
public   static   void  main(String[] args)
    {
        System.out.println(
" Hello "   +   "   "   +   " World "   +   " ! " );
    }
}
<!--  HelloApplet.html  -->
< html >
< head >
< title > Hello Applet </ title >
</ head >

< body >
Here is the "Hello Applet":
< applet  code ="HelloApplet.class"  width ="150"  height ="25" ></ applet >     
</ body >
</ html >

 

2. native method

 1) Java文件, HelloJni.java, 并编译

>javac -d . HelloJni.java

package  tony.test;

public   class  HelloJni
{
    
private   static   final  String jniLib  =   " HelloJni " ;
    
public   native   int  add( int  i1,  int  i2);

    
static
    {
        System.loadLibrary(jniLib);
    }

    
public   static   void  main(String[] args)
    {
        
int  i1  =   100 ;
        
int  i2  =   200 ;
        System.out.println(
new  HelloJni().add(i1, i2));
    }
}

 

2) 生成C++ (Native) 文件tony_test_HelloJni.h

>javah -jni tony.test.HelloJni

3) 编写HelloJni.cpp


#include  " tony_test_HelloJni.h "

JNIEXPORT jint JNICALL Java_tony_test_HelloJni_add(JNIEnv
*  env, jobject obj, jint i1, jint i2)
{
    
int  i  =  i1  +  i2;
    
return  i;
}

4) 编译生成dll

Windows:

>cl -I%JAVA_HOME%/include -I%JAVA_HOME%/include/win32 -LD HelloJni.cpp -FeHelloJni.dll

Solaris:

#cc -G -I/usr/local/java/include -I/usr/local/java/include/solaris HelloJni.cpp / -o libHelloJni.so

-G选项指生成动态链接库.

这里需要说明的是, 在windows下和solaris动态链接库的名称分别为HelloJni.dll和libHelloJni.so.

在java.lang.System下有三个与加载动态链接库有关的函数: load, mapLibraryName, loadLibrary.

load参数为动态链接库绝对路径, 如System.load("F://codes//jnicode//HelloJni.dll");

mapLibraryName会根据操作系统和参数动态链接库名来返回对应的动态链接库文件名, 比如, System.mapLibraryName("HelloJni"); 在Windows下返回HelloJni.dll, 在Solaris下返回libHelloJni.so;

loadLibrary参数为动态链接库名, 如System.load("HelloJni"); 对于不同的系统它会加载对应的库(windows下加载HelloJni.dll, Solaris下加载libHelloJni.so), 而不需改Java代码.

5) 运行Java程序

>java tony.test.HelloJni

两个不错的参考:

Jni中C++和Java的参数传递

[JNI] Eclipse直接完成JAVA调用C/C++ (Eclipse上使用CDT结合MinGW)

推荐一个开源项目: Jace. 极大地方便JNI编程.

http://sourceforge.net/projects/jace/

jace.1.1rc1_05

"Jace is a toolkit designed to make it easy to write JNI-based programs. Jace consists of a C++ runtime library, and a set of tools written in Java. Because Jace is not a framework, it leaves all possible options open to the developer.

Jace's C++ runtime library provides an easy to use API that allows user to manipulate Java objects as if they were C++ objects. Behind the scenes, the runtime library automatically manages the lifetimes of Java references, the mapping of Java exceptions to C++ exceptions, and the binding of C++ threads to the JVM.

Jace's Java tools can automatically generate C++ Proxy classes and C++ Peer classes from Java classes. This means that you can easily access any Java object or implement any Java native function from your C++ code. "

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值