日期:2014-05-16  浏览次数:20746 次

在linux下进行JNI开发

前期准备:

1、Java JDK

2、gcc

3、g++

注意:gcc和g++的版本号要一致:如下:

[qiaoning@qiaoning ~]$ gcc --version
gcc (GCC) <span style="color: #ff0000;">4.6.3 20120306 (Red Hat 4.6.3-2)</span>
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
[qiaoning@qiaoning ~]$ g++ --version
bash: g++: command not found...
[qiaoning@qiaoning ~]$ gcc --version
gcc (GCC) <span style="color: #ff0000;">4.6.3 20120306 (Red Hat 4.6.3-2)</span>
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
?

linux(Fedora) 安装gcc yum install gcc 安装g++ yum install gcc-c++

确保上述准备工作完成后开始下边的工作:

public   class  Hello {  
    static  {  
        try  {  
            System.loadLibrary("hello" );              
        } catch  (UnsatisfiedLinkError e) {  
            e.printStackTrace();  
        }  
    }  
      
    public  Hello() {};  
      
    public   native   void  SayHello(String strName);  
}
?

终端输入 javac Hello.java 后生成Hello.class 文件

然后:javah Hello 生成 Hello.h文件


然后在相同的目录下新建一个Hello.cpp文件:内容如下:

#include "Hello.h"   
#include <stdio.h>   
// 与 Hello.h 中函数声明相同   
JNIEXPORT void  JNICALL Java_Hello_SayHello  (JNIEnv * env, jobject arg, jstring instring)  
{  
  // 从 instring 字符串取得指向字符串 UTF 编码的指针   
  const  jbyte *str =  
    (const  jbyte *)env->GetStringUTFChars( instring, JNI_FALSE );  
  printf("Hello,%s\n" ,str);  
  // 通知虚拟机本地代码不再需要通过 str 访问 Java 字符串。   
  env->ReleaseStringUTFChars( instring, (const   char  *)str );  
  return ;  
}

?

接下来编译生成共享库:

Plain代码
  1. gcc?-I/usr/lib/jvm/java- 1.6 . 0 -openjdk- 1.6 . 0.0 /include?-I/usr/lib/jvm/java- 1.6 . 0 -openjdk- 1.6 . 0.0 /include/linux?-fPIC?-c?Hello.cpp??

注意:这儿可能产生的错误:

1、

Plain代码
  1. gcc:?error?trying?to?exec? 'cc1plus' :?execvp:?No?such?file?or?directory??


原因:没有安装g++,或者gcc和g++的版本不一致

2、