java调用linux下的so库

时间:2023-03-08 19:08:05

1.编写java类

public class Abc {
static {
System.loadLibrary("abc");
} public native static String getAbc(); public static void main(String s[]) {
System.out.println(getAbc());
}
}

终端执行: java Abc.java

再执行:javah Abc 生成Abc.h文件

生成Abc.h的头文件,内容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include </usr/local/jdk1..0_201/include/jni.h>
/* Header for class Abc */ #ifndef _Included_Abc
#define _Included_Abc
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Abc
* Method: getAbc
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_Abc_getAbc
(JNIEnv *, jclass); #ifdef __cplusplus
}
#endif
#endif

编写C文件:

#include <stdio.h>
#include "Abc.h" JNIEXPORT jstring JNICALL Java_Abc_getAbc(JNIEnv *env, jclass t2)
{
char *ptr = "hello world"; jstring str ;
str = (*env)->NewStringUTF(env, ptr); return str;
}

生成动态库:gcc test.c -fPIC -shared -o libabc.so

将动态库拷贝至: cp libabc.so /usr/local/jdk1.8.0_201/jre/lib/amd64/

然后终端运行 java Abc

[root@sec javatest]# javac Abc.java
[root@sec javatest]# java Abc
hello world

至此 java调用linux下动态库成功

//测试jstring转char*

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "Abc.h" JNIEXPORT jstring JNICALL Java_Abc_getAbc
(JNIEnv *env, jclass t)
{
char ptr[] = "hello xxx world"; jstring str ;
str = (*env)->NewStringUTF(env, ptr);
return str;
} /*
* Class: Abc
* Method: setBuf
* Signature: (Ljava/lang/String;)V
*/ char* jstringtochar( JNIEnv *env, jstring jstr )
{
char* rtn = NULL;
jclass clsstring = (*env)->FindClass(env,"java/lang/String");
jstring strencode = (*env)->NewStringUTF(env,"utf-8");
jmethodID mid = (*env)->GetMethodID(env,clsstring, "getBytes", "(Ljava/lang/String;)[B");
jbyteArray barr= (jbyteArray)(*env)->CallObjectMethod(env,jstr, mid, strencode);
jsize alen = (*env)->GetArrayLength(env,barr);
jbyte* ba = (*env)->GetByteArrayElements(env,barr, JNI_FALSE);
if (alen > )
{
   rtn = (char*)malloc(alen + );
   memcpy(rtn, ba, alen);
   rtn[alen] = ;
}
(*env)->ReleaseByteArrayElements(env,barr, ba, );
return rtn;
} JNIEXPORT void JNICALL Java_Abc_setBuf
(JNIEnv *env, jclass t, jstring dev)
{
// jstring 转 char*
//dev1 = ReleaseStringUTFChars(env, dev); char * rtn = NULL;
rtn = jstringtochar(env, dev); printf("[%s]\n", rtn); } JNIEXPORT void JNICALL Java_Abc_setBuf2
(JNIEnv *env, jclass t, jint num)
{
printf("%d\n", num);
}