Linux安全网 - Linux操作系统_Linux 命令_Linux教程_Linux黑客

会员投稿 投稿指南 本期推荐:
搜索:
您的位置: Linux安全网 > Linux编程 > » 正文

Step By Step(Java 本地方法篇)(8)

来源: 未知 分享至:

    Employee(java.lang.String,double,java.util.Date); 具有如下签名:
    (Ljava/lang/String;DLjava/util/Date;)V
    可以看到在D和Ljava/util/Date;之间没有分隔符。另外要注意在这个编码方案中,必须用/代替.来分隔包名和类名。结尾的V表示返回类型为void。即使对Java的构造器没有指定返回类型,也需要将V添加到JVM签名中。
    8.    调用Java非静态方法:
    Java中可以通过JNI调用native的C语言方法,同样JNI也提供了方法可以让C语言中的方法调用Java的方法,见下例:
    1)    包含native方法的Java类代码:

1     import java.io.PrintWriter;
2 public class Printf {
3 public static native void fprint(PrintWriter out,String format,double x);
4 static {
5 System.loadLibrary(\"Printf\");
6 }
7 }

    2)    实现本地方法的C语言代码:

 1     #include \"Printf.h\"
2 #include <stdlib.h>
3 #include <string.h>
4 #include <float.h>
5
6 JNIEXPORT void JNICALL Java_Printf_fprint
7 (JNIEnv* env, jclass cl, jobject out, jstring format, jdouble x)
8 {
9 const char* cformat = env->GetStringUTFChars(format,NULL);
10 char* cstr = (char*)calloc(strlen(cformat) + 20,sizeof(char));
11 sprintf(cstr,cformat,x);
12 jstring str = env->NewStringUTF(cstr);
13 free(cstr);
14 env->ReleaseStringUTFChars(format,cformat);
15
16 jclass class_PrintWriter = env->GetObjectClass(out);
17 //对应于void PrintWrite.print(String)方法
18 jmethodID id_print = env->GetMethodID(class_PrintWriter,\"print\",\"(Ljava/lang/String;)V\");
19 //这里Void是CallXxxMethod一组方法中的一个,表示调用函数的返回值类型。
20 //因此该方法的返回值也是void,如果调用CallIntMethod,其返回值将为jint。
21 env->CallVoidMethod(out,id_print,str);
22 }

    3)    含有main函数的调用测试代码:

 1     import java.io.PrintWriter;
2 public class MyTest {
3 public static void main(String[] args) throws Exception {
4 double price = 44.95;
5 double tax = 7.75;
6 double amountDue = price

Tags:
分享至:
最新图文资讯
1 2 3 4 5 6
验证码:点击我更换图片 理智评论文明上网,拒绝恶意谩骂 用户名:
关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 发展历史