• linux下java调用.so文件的方法1: JNI


    摘自http://blog.163.com/squall_smile/blog/static/6034984020129296931793/

    https://my.oschina.net/simaben/blog/322850
     

    linux下java调用.so文件的方法1

     

    刚刚试过一个这样的例子,省事起见,略改并记录如下:

    //package net.wangliping;
      2 public class Hello
      3 {
      4     static
      5     {
      6
      7         System.loadLibrary("goodluck");
      8     }
      9
     10     public native static int get();
     11     public native static void set(int i,String s);
     12
     13     public static void main(String[] args)
     14     {
     15         try{
     16         Hello test = new Hello();
     17         test.set(10,"5555");
     18         System.out.println(test.get());
     19         }catch(Exception ex)
     20         {
     21           System.out.println("ssssss");
     22         }
     23     }
     24 }

    OK java类有了。

    下面javac Hello.java

    然后再javah Hello

    生成了Hello.h

    然后编写Hello.c

      1 #include "Hello.h"
      2
      3 int i = 0;
      4
      5 JNIEXPORT jint JNICALL Java_Hello_get(JNIEnv *env, jclass jc)
      6 {
      7     return i;
      8 }
      9
     10 JNIEXPORT void JNICALL Java_Hello_set(JNIEnv *env, jclass jc, jint j,jstring s)
     11 {

     13         char * tsetstr=(char*)(*env)->GetStringUTFChars(env, s, NULL);//注意此处jstring和char *的转换
     14         printf("%s-------- ",tsetstr); 

    15     i = j;
     16 }

    保存,然后执行如下编译指令:

      1 gcc -fPIC -D_REENTRANT -I/usr/java/jdk1.6.0_31/include -I/usr/java/jdk1.6.0_31/include/linux -c Hello.c
      2 gcc -shared Hello.o -o libgoodluck.so

    此时就生成了libgoodluck.so

    注意为了让java找到此so,运行:export LD_LIBRARY_PATH=.,将当前目录加入此环境变量。

    然后运行java Hello,好屏幕上打出了10.

    然后测试下传入String型的参数,对应的jni定义应为jstring,但却出了些问题,在显示结果时仿佛内存溢出的样子。

    后来查了查,需对jstring和char *作一个转换,如代码中所示,然后结果就正常。
  • 相关阅读:
    拉姆达表达式(lambda Expressions)
    Func,Action 的介绍
    VS2012 此模板尝试加载组件程序集”NuGet.VisualStudio.interop,Version=1.0.0.0 的解决
    444 英语口语
    Base algorithm
    Windows Search Service
    Windows Azure Storage
    HDU 3395 Special Fish
    CodeForces 235B Let's Play Osu!
    HDU 3435 A new Graph Game
  • 原文地址:https://www.cnblogs.com/LiuYanYGZ/p/6109516.html
Copyright © 2020-2023  润新知