java调用c入门介绍.

来源:互联网 发布:软件项目的软件schdule 编辑:程序博客网 时间:2024/05/17 23:57
一:
编写一个包含本地方法的java类.并使用System.laod()或者是使用
System.loadLibrary()方法加载共享库文件.
注:如果使用System.loadLibrary(),该方法参数接收一个共享库的名称.
  共享库的参数名称命名的规则如下:lib+共享库的名称+".so"或者是".dll".
  如果使用System.load();那么需要加载该库文件的完整路径名称.(如System.load("c://jni//test.so"));

编写java代码的文件如下:
package com.onesuncomm.jnitest;public class Test {//native function.private native String getLine(String test);public static void main(String[] args) {Test t = new Test();String input = p.getLine("line:");System.out.println("User Input Line:"+input);}//load library.static{System.load("/home/zshh/workspace/javacallctest/jni/libStringToBytes.so");}}
//如您创建工程名为:javacallctest,并且创建一个如下包, com.onesuncomm.jnitest包.
//您需要进入到当前工程的目录中.输入指令如下(cd /home/zshh/workspace/javacalltest/src)
zshh@ubuntu:~/workspace/javacallctest/src$ javac -cp /home/zshh/workspace/javacallctest/src com/onesuncomm/jnitest/Test.java

然后输入javac -cp /home/zshh/workspace/javacalltest/src com/onesuncomm/jnitest/Test.java

       CLASSPATH环境变量。作用是指定类搜索路径,要使用已经编写好的类,前提当然是能够找到它们了

指定-classpath路径为/home/zshh/workspace/javacalltest/src 的意思您的目录中必须包含Test.java文件.


二:
进入到当前工程目录.我这里的是:/home/zshh/workspace/javacallctest/bin目录.
使用这个java文件生成的.class文件生成一个头文件.生成该c文件的头文件的方法如下:
进入到/home/zshh/workspace/javacallctest/bin 
javah -d ../jni com.onesuncomm.JniCallCTest
这个命令的意思是生成一个JniCallCTest.h的头文件,并将这个头文件存放在当前目录的上层目录的jni目录中.
并将头文件存放到/home/zshh/workspace/javacalltest/jni目录下.
生成头文件中的代码如下:

/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class com_onesuncomm_jnitest_Prompt */#ifndef _Included_com_onesuncomm_jnitest_Prompt#define _Included_com_onesuncomm_jnitest_Prompt#ifdef __cplusplusextern "C" {#endif/* * Class:     com_onesuncomm_jnitest_Prompt * Method:    getLine * Signature: (Ljava/lang/String;)Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_onesuncomm_jnitest_Prompt_getLine  (JNIEnv *, jobject, jstring);#ifdef __cplusplus}#endif#endif


三: 
编写c代码的实现:该c是为了现实在java中定义的native方法的.当现实这个方法的时候,讲刚刚的头文件包含进去.
代码如下:
编写c的代码.这个代码的存放在
/home/zshh/workspace/javacallctest/jni目录下. 


/*************************************************************************    > File Name: StringToBytes.c    > Author: zshh0604    > Mail: zshh0604@.com     > Created Time: Sun 15 Dec 2013 09:46:11 PM PST ************************************************************************/#include<stdio.h>#include "com_onesuncomm_jnitest_Test.h"JNIEXPORT jstring JNICALLJava_com_onesuncomm_jnitest_Test_getLine(JNIEnv *env,jobject obj, jstring test){char buf[128];const jbyte *str;str = (*env)->GetStringUTFChars(env,test,NULL);if(str==NULL){return NULL;}printf("%s",str);(*env)->ReleaseStringUTFChars(env,test,str);scanf("%s",buf);//scan user keybord input char.return (*env)->NewStringUTF(env,buf);//convert jstring from char.}


四:
编译生成.so文件,或者是.dll文件.
编译方法如下:同样您需要进入到/home/zshh/workspace/javacallctest/jni目录下
使用如下命令:
 gcc -I/usr/lib/jvm/java-6-openjdk/include -fPIC -shared -olibStringToBytes.so StringToBytes.c 
当您自己生成.so文件需要使用到第三方提供给您的.so文件的时候.您的c文件需要包含该.so文件的头文件.
编译的时候您需要将他连接起来.
命令如下:
 gcc -I/usr/lib/jvm/java-6-openjdk/include -fPIC -shared -olibStringToBytes.so StringToBytes.c  -L./ -llibsms.so //-L参数指明第三方库的位置. //-l当前第三方库的名称.

五:在eclipse中运行您的代码.在控制台中输入应该.回车.就应该可以看到效果了. 

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 骨龄比实际年龄小怎么办 身体年龄比实际年龄大怎么办 吃了不熟的鸡蛋怎么办 六角龙尾巴烂了怎么办 兰花长出来的包怎么办 长寿花花开败了怎么办 手机分期0首付怎么办办 办分期手机掉了怎么办 手机办分期被骗了怎么办 办手机分期年龄不够怎么办 信美分期没额度怎么办 家里人不给我钱怎么办 商场租金收不上来怎么办 魅蓝2电池坏了怎么办 格力空调不制冷怎么办 空调外机不好放怎么办 美的空调显示e3怎么办 发现安装空调条码被撕怎么办 删除了国美安装码怎么办 海信空调保修卡丢了怎么办 海尔空调保修卡丢了怎么办 科龙空调不制冷怎么办 魅族s6屏幕碎了怎么办 格力空调化霜怎么办 一开空调就跳闸怎么办 洗衣机顶盖的安全开关损坏怎么办 苹果平板电脑拍照坏了怎么办 苹果hom键不灵了怎么办 平板电脑home键发烫怎么办 华为平板无法输入资料怎么办 安卓平板没声音怎么办? 平果手机充不了电怎么办 苹果6s用电太快怎么办 平板充不起电了怎么办 日本买的电器国内售后怎么办 海淘地址试投不成功怎么办 怀孕了吐得厉害怎么办 玩网页游戏好卡怎么办 网页游戏占cpu高怎么办 微信有余额绑定其他名下怎么办 银行卡绑定支付余额不对怎么办