符合中小企业对网站设计、功能常规化式的企业展示型网站建设
本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...
商城网站建设因基本功能的需求不同费用上面也有很大的差别...
手机微信网站开发、微信官网、微信商城网站...
准确说,在一个Java项目里,可以调用部分C写的代码
成都创新互联专注于炎陵网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供炎陵营销型网站建设,炎陵网站制作、炎陵网页设计、炎陵网站官网定制、重庆小程序开发服务,打造炎陵网络公司原创品牌,更为您提供炎陵网站排名全网营销落地服务。
但反过来是不行的,在一个C的项目里,是不可能调用java代码的
1. 编写并编译J2C.java
import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
public class J2C
{
static
{
try{
// 此处即为本地方法所在链接库名
System.loadLibrary("j2c");
} catch(UnsatisfiedLinkError e)
{
System.err.println( "Cannot load J2C library:\n " +
e.toString() );
}
}
//声明的本地方法
public static native int write2proc(int pid);
public static void main(String[] args){
//获取本进程(即主线程)的pid
final RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean();
final String info = runtime.getName();
final int index = info.indexOf("@");
if (index != -1) {
final int pid = Integer.parseInt(info.substring(0, index));
System.out.println(info);
System.out.println(pid);
write2proc(pid);
}
try{
Thread.sleep(8000);
} catch(InterruptedException e){
e.printStackTrace();
}
}
}
note:Java程序中System.loadLibrary参数名表示要载入的C/C++共享库,第6步生成的共享库名必须与该参数一致,即System.loadLibrary(Name) 对应共享库名libName.so (共享库名必须以lib开头)
2. 生成C头文件J2C.h:javah J2C
/* DO NOT EDIT THIS FILE - it is machine generated */
#include jni.h
/* Header for class J2C */
#ifndef _Included_J2C
#define _Included_J2C
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: J2C
* Method: write2proc
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_J2C_write2proc
(JNIEnv *, jclass, jint);
#ifdef __cplusplus
}
#endif
#endif
note:1. 头文件自动生成,不要修改它;
2. 函数JNIEXPORT jint JNICALL Java_J2C_write2proc(JNIEnv *, jclass, jint);
按照注释的说明是在J2C.java文件的类J2C的方法write2proc处定义,故C程序的实现函数必须与该处签名一致;
3. 编写C程序J2C.c
#include stdio.h
#include "J2C.h"
JNIEXPORT int JNICALL Java_J2C_write2proc(JNIEnv * env, jobject arg, jint pid)
{
printf("current pid is %d\n", pid);
return 0;
}
4. 编译C程序
因为C程序里#include "J2C.h"而J2C.h又#include jni.h, 而gcc里面默认环境并不知道jni.h是什么东西,故编译时需要告诉编译器jni.h的位置( jni.h在jdk 的$JAVA_HOME/include下面),所以才有了上面的编译参数;
因为使用gcc编译得到动态库,在jni调用的时候,某些情况会有异常, 可尝试改用g++。
总结
1. Java中方法的原型声明与C/C++对应的实现文件定义必须一致(可以通过自动生成的C/C++头文件来比较),尤其是类名和方法名;
2. Java中System.loadLibrary()载入的共享库名必须与后面C/C++生成的共享库名一致。
Java端可以做成网络服务,方法就很多了,可以是RESTful形式、基于SOAP的WebService、或者用Netty等。C/C++端可以通过开源库libcurl调用RESTful形式的接口、可以通过gSoap调用基于SOAP的WebService接口。
如果命令行可以解决的问题,都不算问题。
比如你可以在c语言中调用system("java -jar xxx.jar")
当然,这种方法很坑爹。需要用文件或者网络来实现数据的传输和交换的介质。
C语言调用Java,还有Java调用C,都使用到JNI技术,C语言调用需要创建Java虚拟机,可查看函数JNI_CreateJavaVM、DestroyJavaVM的资料,函数声明在jni.h头文件(JDK)中。需注意参数类型转换,两种语言的参数类型和传递有讲究,有多个返回的话,必须传递对象参数进行处理。