java jni 开发

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值