红联Linux门户
Linux帮助

java jni开发

发布时间:2016-05-28 10:38:34来源:linux网站作者:rznice

OS环境 ubuntu 16.04 STL。


java代码如下:
package com.mobile.register;

public class Starter {
static
{
System.load("libjni.so");
}
protected static native  String getstr(String vs);
protected static native  String getnames(String vs);

public static void main(String[] args) {
System.out.println(getstr(""));
}
}


编译上述java文件。到生成的class的根目录,也就是com目录下,运行:javah com.mobile.register.Starter后,会在当前的目录下生成一个com_mobile_register_Starter.h头文件。


内容如下:

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

#ifndef _Included_com_mobile_register_Starter
#define _Included_com_mobile_register_Starter
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_mobile_register_Starter
* Method:getstr
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_mobile_register_Starter_getstr
(JNIEnv *, jclass, jstring);

/*
* Class: com_mobile_register_Starter
* Method:getnames
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_mobile_register_Starter_getnames
(JNIEnv *, jclass, jstring);

#ifdef __cplusplus
}
#endif
#endif


新建一个.c文件,此处叫jni.c。其内容如下:

#include "com_mobile_register_Starter.h"

JNIEXPORT jstring JNICALL Java_com_mobile_register_Starter_getstr(JNIEnv *env, jclass jc, jstring js){
char result[]="abc"; 
return (*env)->NewStringUTF(env,result); 
}

/*
* Class: com_mobile_register_Starter
* Method:getnames
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_mobile_register_Starter_getnames(JNIEnv *env, jclass jc, jstring js){
char result[]="names"; 
return (*env)->NewStringUTF(env,result); 
}


将jni.c编译成.o文件:

gcc -fPIC -I/usr/local/jdk/include -I/usr/local/jdk/include/linux -c jni.c

/usr/local/jdk/include是jni.h头文件所在的路径
/usr/local/jdk/include/linux是jni_md.h所在的路径
64位系统需要使用-fPIC 这个参数


将.o文件链接成.so库文件

gcc -shared jni.o -o libjni.so


注:和windows下不同,linux的库文件必须是以libxxx.so形式命令的(或者 libxxx.so.y,y是版本号),lib前缀是为了系统能够识别它,xxx是java代码System.load(“xxx”);中引用库的名字。


将java代码中的路径换成绝对路径如下:

package com.mobile.register;

public class Starter {
static
{
System.load("/usr/work/cert/out/production/create509/libjni.so");
}

protected static native  String getstr(String vs);
protected static native  String getnames(String vs);

public static void main(String[] args) {
System.out.println(getstr(""));
}
}


输入如下结果:

abc


本文永久更新地址:http://www.linuxdiyf.com/linux/21021.html