跨平台调用之一——java调用so库

之前已经试过用c调用.a库,也有总结在工作文档中,下面在家试试用java利用jni(jna应该更方便)调用.so库(其实很相似,不过之前是Linux,这里是win)
建立项目:
跨平台调用之一——java调用so库_第1张图片
1.编写源文件:

package com.demo.TestLib.JniSo;

public class Hello{
	static{
		System.load("/lib/libHello.so");
	}
	public native void say();
	
	public native String world(String str);
	
	public static void main(String...args){
	Hello hello = new Hello();
	hello.say();
	System.out.println("java : "+hello.world("hello"));
	}
}

2.编译Hello.java - Hello.class
在这里插入图片描述
解决办法:将系统变量中的path路径,也复制到用户变量的Path路径中,(为什么呢?)
在这里插入图片描述
在这里插入图片描述
3.编译Hello.class 生成 com_jni_Hello.h 的头文件
资料中说:用
在这里插入图片描述
但是jdk9之后(大概)javah不可用了,应:
在这里插入图片描述
生产了一个头文件:
在这里插入图片描述
4.编写c++/c的业务代码,引用com_jni_Hello.h 的头文件,并实现定义的方法

#include "com_demo_TestLib_JniSo_Hello.h"
#include "string.h"
JNIEXPORT void JNICALL Java_com_demo_TestLib_JniSo_Hello_say(JNIEnv *env, jobject object){
 
        printf("hello world!");
  }

JNIEXPORT jstring JNICALL Java_com_demo_TestLib_JniSo_Hello_world(JNIEnv *env, jobject obejct, jstring string){
          const char *wd = " world!!";
          const char *getstr = (*env)->GetStringUTFChars(env,string, 0);
          char *str;

          str=strcpy(str,wd);
          str=strcpy(str,getstr); 

         jstring out= (*env)->NewStringUTF(env,str);

          return out;
  }

以下待完成:

5.编译c/c++ 代码生成动态链接库 .so文件

gcc -fPIC -D_REENTRANT C:\java\jdk-13\include\win32 -c Hello.c

跨平台调用之一——java调用so库_第2张图片


6:把so的路劲添加到LD_LIBRARY_PATH变量

export LD_LIBRARY_PATH=/home/admin/lib

7: 运行java程序

java com.jni.Hello

8:结果

java : hello
hello world!

————————————————
版权声明:本文为CSDN博主「ailice001」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ailice001/article/details/79880876

另:
1.so为linux下的产物,所以我用windows没有道理。。。。再讨论吧
so库文件使用
2.java调用dll倒是需要学习
java调用dll库
3.java利用jna调用.so库
添加链接描述

你可能感兴趣的:(跨平台调用,so库)