linux java jni_linux环境下java通过JNI调用c,c++

参考资料:

主要参考资料1

程序流程貌似是TestWordJni.class调用WordJni.class,WordJni.class调用libWordJni.so。因为我把其他文件(.java .h .c)删了都没事,WordJni.class不能删。

1.创建.java文件

import java.util.*;

public class WordJni{

public native String print(String content);

static

{

System.loadLibrary("WordJni");

}

}

2.[hadoop@Master jni]$ javac WordJni.java

3.生成.h文件[hadoop@Master jni]$ javah -jni WordJni

/* DO NOT EDIT THIS FILE - it is machine generated */

#include

/* Header for class WordJni */

#ifndef _Included_WordJni

#define _Included_WordJni

#ifdef __cplusplus

extern "C" {

#endif

/*

* Class: WordJni

* Method: print

* Signature: (Ljava/lang/String;)Ljava/lang/String;

*/

JNIEXPORT jstring JNICALL Java_WordJni_print

(JNIEnv *, jobject, jstring);

#ifdef __cplusplus

}

#endif

#endif

4.编写自己的C文件,注意:.c文件函数的名称,返回值都要和生成的.h文件相同,不然会出现java.lang.UnsatisfiedLinkError错误

#include

#include

#include

#include "WordJni.h"

JNIEXPORT jstring JNICALL

Java_WordJni_print(JNIEnv *env,jobject obj, jstring content)

{

char buf[128];//注c使用(*env),c++使用env

const jbyte *str = (const jbyte *)(*env)->GetStringUTFChars(env,content, JNI_FALSE);

strcpy(buf, str);

strcat(buf, "----copy that");

printf("%s\n",buf);

(*env)->ReleaseStringUTFChars(env, content, (const char *)str );

return (*env)->NewStringUTF(env, buf);

}

5.编译,生成库文件

[hadoop@Master jni]$ gcc -I/usr/java/jdk1.6.0_31/include -I/usr/java/jdk1.6.0_31/include/linux -fPIC -shared -o libWordJni.so WordJni.c

6.编写调用程序TestWordJni.java

public class TestWordJni {

public static void main(String argv[]) {

new TestWordJni();

}

public TestWordJni() {

new WordJni().print("Hello,World !"); //调用TestJni的原生函数print

}

}

7.生成.class文件

[hadoop@Master jni]$ javac TestWordJni.java

8.执行

[hadoop@Master jni]$ java -Djava.library.path='.' TestWordJni

9。结果

Hello,World !----copy that

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值