jni記錄

關於jni的簡單使用
1.書寫Java類

public class Lxy {

    static {
        System.loadLibrary("Lxy");
    }

    private native String sumLxy(int a, int b, String c);

    public static void main(String[] args) {

        int a = 10, b = 20;
        String c = "name is lsd!", d = null;
        d = new Lxy().sumLxy(a, b, c);
        System.out.println("c的值爲:" + c + " d的值爲:" + d);
    }
}

2.生成頭文件
javac -h path 文件 例如:

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

#ifndef _Included_Lxy
#define _Included_Lxy
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     Lxy
 * Method:    sumLxy
 * Signature: (IILjava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_Lxy_sumLxy
  (JNIEnv *, jobject, jint, jint, jstring);

#ifdef __cplusplus
}
#endif
#endif

3.根據頭文件時間聲明

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "Lxy.h"
#include <pthread.h>

JNIEXPORT jstring JNICALL Java_Lxy_sumLxy(JNIEnv *env, jobject jobj, jint a, jint b, jstring s)
{
    jint c = a + b;
    printf("c的值爲:%d\n", c);
    char *d = (*env)->GetStringUTFChars(env, s, NULL);
    printf("%s\n", d);
    jsize num = (*env)->GetStringLength(env, s);
    printf("strlen = %d\n", num);
    (*env)->ReleaseStringUTFChars(env, s, d);
    char *str = (char *)malloc(sizeof(char) * 1000);
    memset(str, 0, sizeof(char) * 1000);
    strcpy(str, "alsjdnkasjndkjasndkljnaskjdnLKASDNKLJANsdAKSNDKLAsndjaNSD");
    return (*env)->NewStringUTF(env, str);
}

4.編譯C語言代碼

gcc -fPIC -shared -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/linux" -o libLxy.so Lxy.c

5.運行

java -Djava.library.path=path Lxy

查看結果

lxy@ubuntu:~/project$ java -Djava.library.path=. Lxy
c的值爲:30
name is lsd!
strlen = 12
c的值爲:name is lsd! d的值爲:alsjdnkasjndkjasndkljnaskjdnLKASDNKLJANsdAKSNDKLAsndjaNSD
lxy@ubuntu:~/project$

關於類型對照

// In "win\jni_mh.h" - machine header which is machine dependent
typedef long            jint;
typedef __int64         jlong;
typedef signed char     jbyte;
 
// In "jni.h"
typedef unsigned char   jboolean;
typedef unsigned short  jchar;
typedef short           jshort;
typedef float           jfloat;
typedef double          jdouble;
typedef jint            jsize;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章