发布网友 发布时间:2022-04-24 09:46
共4个回答
好二三四 时间:2022-06-10 17:21
<link rel="stylesheet" href="https://js.how234.com/third-party/SyntaxHighlighter/shCoreDefault.css" type="text/css" /><script type="text/javascript" src="https://js.how234.com/third-party/SyntaxHighlighter/shCore.js"></script><script type="text/javascript"> SyntaxHighlighter.all(); </script>
很多朋友都想知道java怎么调用c++?下面就一起来了解一下吧~
1、编写并编译Java程序
javac J2C.java => J2C.class
2、生成C/C++头文件
javah J2C => J2C.h (安装JDK后,$JAVA_HOME应该已加入$PATH, 否则使用绝对路径,例如/usr/bin/javah)
3、编写对应的C/C++程序:J2C.c
4、生成C/C++目标文件
gcc -I/usr/lib/jvm/java-6-openjdk-amd/include -I/usr/lib/jvm/java-6-openjdk-amd/include/linux -fPIC -c J2C.c => J2C.o
5、生成C/C++共享库
gcc -shared -Wl,-soname,libj2c.so.1 -o libj2c.so.1.0 J2C.o => libj2c.so.1.0
6、重命名cp libj2c.so.1.0 libj2c.so => libj2c.so
7、将共享库加入动态链接库的路径(此例为当前目录)
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
8、执行Java程序,实现跨语言通信
java J2C
以上就是小编今天的分享,希望可以帮到大家。
热心网友 时间:2022-06-10 14:29
Java调用C语言程序时,主要是涉及到操作系统底层的事件。这种时间Java无法处理,例如用户上传一个视频文件,需要后台给视频加上水印,或者后台分离视频流和音频流。只能通过调用C语言处理。
使用Java如何去调用C语言的接口呢?使用Java的JNI技术。
具体调用步骤如下:
1.首先创建Java文件 HelloJni.java ,并创建native方法。
2.编译Java文件并生成java头文件。
3.创建C语言文件,HelloWorld.c。
4.生成动态链接库文件 libhello.so。
5.设置动态链接库文件的目录。
6.把刚才生成的so文件拷贝到/home/lib下,然后执行class文件。
热心网友 时间:2022-06-10 15:47
java如何调用c
java要想调用c的程序,那就要把c生成dll文件给java调用,也就是java调用dll文件,如何调用呢,就要使用java的本地化方法JNI调用c的dll文件。
1、java部分。
实例1:Sample1.java文件
public class Sample1 {
public native int intMethod(int n);
public native boolean booleanMethod(boolean
bool);
public native String stringMethod(String
text);
public native int intArrayMethod(int[] args);
public static void main(String[] args)
{
System.loadLibrary("Sample1");
Sample1 sample =
new Sample1();
int square =
sample.intMethod(5);
boolean bool =
sample.booleanMethod(true);
String text =
sample.stringMethod("JAVA");
int sum = sample.intArrayMethod(new
int[] { 1, 1, 2, 3, 5, 8, 13 });
System.out.println("intMethod: " +
square);
System.out.println("booleanMethod: " +
bool);
System.out.println("stringMethod: " +
text);
System.out.println("intArrayMethod: " +
sum);
}
}
2、用javac编译成Sample1.class,然后用javah编译Sample1,生成Sample1.h文件。具体的命令如下:
javac Sample1.java
javah Sample1
3、打开生成的Sample1.h,代码如下:
#include <jni.h>
#ifndef _Included_Sample1
#define
_Included_Sample1
#ifdef __cplusplus
extern "C"
{
#endif
JNIEXPORT jint JNICALL Java_Sample1_intMethod
(JNIEnv *, jobject, jint);
JNIEXPORT jboolean JNICALL
Java_Sample1_booleanMethod
(JNIEnv *, jobject, jboolean);
JNIEXPORT jstring JNICALL
Java_Sample1_stringMethod
(JNIEnv *, jobject, jstring);
JNIEXPORT jint JNICALL
Java_Sample1_intArrayMethod
(JNIEnv *, jobject, jintArray);
#ifdef __cplusplus
}
#endif
#endif
这个文件主要是为了生成java调用c的主要方法,也即是上面的几个方法。
3、用c语言的程序来实现上班生成的几个方法,即Sample1.c源代码如下:
#include "Sample1.h"
#include
<string.h>
JNIEXPORT jint JNICALL Java_Sample1_intMethod
(JNIEnv
*env, jobject obj, jint num) {
return num *
num;
}
JNIEXPORT jboolean JNICALL
Java_Sample1_booleanMethod
(JNIEnv *env, jobject obj, jboolean
boolean) {
return !boolean;
}
JNIEXPORT jstring JNICALL
Java_Sample1_stringMethod
(JNIEnv *env, jobject obj, jstring string)
{
const char *str = (*env)->GetStringUTFChars(env, string,
0);
char cap[128];
strcpy(cap,
str);
(*env)->ReleaseStringUTFChars(env, string,
str);
return (*env)->NewStringUTF(env,
strupr(cap));
}
JNIEXPORT jint JNICALL
Java_Sample1_intArrayMethod
(JNIEnv *env, jobject obj, jintArray
array) {
int i, sum = 0;
jsize len =
(*env)->GetArrayLength(env,array);
jint *body =
(*env)->GetIntArrayElements(env, array, 0);
for
(i=0; i<len; i++){
sum +=
body[i];
}
(*env)->ReleaseIntArrayElements(env, array, body, 0);
return sum;
}
void
main(){}
4、创建dll文件。如果你的jdk的路径为C:\jdk\的话那么你可以用cl命令生成dll文件,但是你可能要安装vc
windows平台命令如下:cl -IC:\jdk\include -IC:\jdk\include\win32 -LD Sample1.c
-FeSample1.dll
运行如上命令就可以生成你所需要的dll文件了
5、如果上述都成功的话,那么我们的工作基本上就做完了,运行测试程序就可以的了,即运行Sample1.java,命令如下:
java Sample
如果运行成功的话,结果如下:
intMethod: 25
booleanMethod: false
stringMethod: JAVA
intArrayMethod:
33
至此我们调用c已经完成了。
提示:上面的程序没有用到包,如果有包的话运行会有区别的,也就是在生成.h文件的之后,其方法格式为“java_包名_函数名_方法名”。生成的dll文件要和包放在同一路径。
热心网友 时间:2022-06-10 17:21
Java调用C++/C有3中方式:JNI、JNA、JNative。
注:1、JNA的方式很普遍。
2、Java和C++/C交互的难点在于数据结构的对应
3、java不可以直接调用C#代码,C#代码需要托管
JNI
(Android调用,普通java类似)使用步骤:
1、编写静态方法(用java声明)
2、编译生成class文件
3、编译生成h文件
4、编写C文件(用C/C++实现)
5、配置NDK
6、配置so库
7、在Activity调用(Java调用C/C++)。
JNative
使用步骤:
1、下载Jnative.jar,下载地址如下:
http://nchc.dl.sourceforge.net/sourceforge/jnative/JNative.jar
把JNativeCpp.dll放在c:\windows\system32目录下;把要调用的dll文件也放在c:\windows\system32目录下。
2、编码调用dll,示例如下:
JNative jnative = new JNative(dllNmae,"disConnect"); //调用a.dll中disconnect方法jnative.setRetVal(Type.INT); //设置返回类型为int,也可以设置为float,string等类型int pindex = 0;jnative.setParameter(pindex++, hHandle); //设置第一个参数为hHandlejnative.invoke(); //正式执行这个函数return jnative.getRetValAsInt(); //设置返回值为int,并返回
JNA
使用步骤:
1、下载 jna-x.x.x.jar放入到java项目类路径下;
2、创建一个接口继承Library;
3、声明方法,方法的返回值和参数要和本地dll对应;
4、实例化接口实例;
5、调用接口;
//1、创建接口public interface CSIInterface extends Library {
//2、声明方法
public Boolean CreateCsiInstance(int deviceId, Boolean bSquelchLogging);}//3、实例化接口public CSIInterface instance = (CSIInterface) Native.loadLibrary(
"macitcsi.dll", CSIInterface.class);//4、调用接口instance.CreateCsiInstance(4,true);
使用注意点:
1、dll的位数要和JDK的位数一致;
2、Java和C的数据类型对应关系如下,和C++的数据类型可以通过C为中转:
3、常用记录:com.sun.jna.Structure对应结构体,com.sun.jna.Callback对应回调。
作者:China第一程序员
链接:https://www.jianshu.com/p/24174203c3d7
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。