我的第一个Linux下的JNI程序

72 篇文章 0 订阅
52 篇文章 0 订阅

这个程序很早就开始写了,但过程中遇到了太多小问题,磕磕绊绊的,到今天程序才算是跑起来。

 

1、写Java源程序

 class HelloWorld {
     private native void print();

     public static void main(String[] args) {
         new HelloWorld().print();
     }
     static {
         System.loadLibrary("HelloWorld");
         
     }
 }


本地函数是print,linux下,此库文件应该是libHelloWorld.so.

 

2、编译并生成头文件

javac HelloWorld.java

javah HelloWorld


生成的头文件为:

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

#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloWorld
 * Method:    print
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloWorld_print
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif


 

3、C程序

#include <jni.h>
#include <stdio.h>
#include "HelloWorld.h"

JNIEXPORT void JNICALL 
Java_HelloWorld_print(JNIEnv *env, jobject obj)
{
	printf("i am linc !!!\n");
	return;
}


 

4、编写make文件(此文件没有后缀,就叫makefile)

libHelloWorld.so:HelloWorld.o
	gcc -rdynamic -shared -o libHelloWorld.so HelloWorld.o
HelloWorld.o:HelloWorld.c HelloWorld.h
	gcc -c HelloWorld.c -I./ -I/usr/java/jdk1.6.0_25/include -I/usr/java/jdk1.6.0_25/include/linux


 

5、运行makefile,只要在makefile目录下,make回车就ok啦

此时会生成libHelloWorld.so,按道理说,把此so文件放在java.class文件的目录,就可以正常运行了。

但是我失败了。

报错:java.lang.UnsatisfiedLinkError: no HelloWorld in java.library.path

 

最后的解决方法是这样,用如下

public class LibPath {
	public static void main(String args[]){  
		  
		System.out.println("Linc");  
		System.out.println(System.getProperty("java.library.path"));  
		  
		}  
}


打印出lib目录,我这用到了/usr/java/jdk1.6.0_25/jre/lib/i386/server

然后把so文件放入其中,就ok了。

此间也遇到了没有权限的问题,我用root把此目录的权限给改了。

现在可以向下进行JNI的学习了!!!

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值