Linux下通过java调用C/C++代码

最近写程序时需要java调用本地C/C++代码,网上有一些例子,但是用起来会发生莫名其妙的错误,所以想把自己亲手做的东西,详细的写下来。

以下为具体步骤

1、先在eclipse里编写java代码,如下:

package javacallc;

public class javacallc {
    static {
        System.loadLibrary("javacall1");
    }
    public native static int calljc(int p);//接口函数,必须使用native关键字
    public static void main(String[] args){
        javacallc jc=new javacallc();
        int q=jc.calljc(9);
        System.out.println(System.getProperty("java.library.path"));//输出java.library.path的目录,具体作用稍后提到
        System.out.println(q);
    }
}


2、在控制台进入java代码的src目录:cd workspace/javacallc/src

然后通过javah命令生成C的头文件  javah -jni javacallc.javacallc

Linux下通过java调用C/C++代码_第1张图片

生成的头文件如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class javacallc_javacallc */

#ifndef _Included_javacallc_javacallc
#define _Included_javacallc_javacallc
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     javacallc_javacallc
 * Method:    calljc
 * Signature: (I)I
 */
JNIEXPORT jint JNICALL Java_javacallc_javacallc_calljc
  (JNIEnv *, jclass, jint);

#ifdef __cplusplus
}
#endif
#endif


3、编写C 代码,和生成的头文件在同一目录下:

#include <stdio.h>
#include "javacallc_javacallc.h"
void print_element(char *in);
JNIEXPORT jint JNICALL Java_javacallc_javacallc_calljc(JNIEnv *env, jclass jc, jint p)
{
    return p*p;
}

4、编译生成.so文件

gcc javacallc.c -fpic -shared -o libjavacall.so(注:生成的so文件名格式为lib----.so,-代表动态链接库的名)

将生成的libjavacall.so拷贝(通过cp命令)到java.library.path(由java代码中得到),若不拷到java.library.path中,则会出现错误

Exception in thread "main" java.lang.UnsatisfiedLinkError: no javacall1 in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1886)
    at java.lang.Runtime.loadLibrary0(Runtime.java:849)
    at java.lang.System.loadLibrary(System.java:1088)
    at javacallc.javacallc.<clinit>(javacallc.java:5)

5、执行eclipse中的代码



注:本人菜鸟一个,如出现错误,望请大神见谅……







你可能感兴趣的:(java,编程语言,jni,C语言)