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