接上一篇:http://percy.blog.ubuntu.org.cn/2009/05/09/%E5%9C%A8linux%E5%B9%B3%E5%8F%B0%E4%B8%8B%E4%BD%BF%E7%94%A8jni%E8%BD%AC/

1.

pjq@localhost ~/workspace/jni $ cat Hello.java
public class Hello
{
static
{
try
{
//此处即为本地方法所在链接库名
System.loadLibrary("hello");
}
catch(UnsatisfiedLinkError e)
{
System.err.println( "Cannot load hello library:\n " +
e.toString() );
}
}
public Hello()
{
}
//声明的本地方法
public native void SayHello(String strName);
}

2.

代码:
pjq@localhost ~/workspace/jni $ javac Hello.java

3.生成Hello.h

代码:
pjq@localhost ~/workspace/jni $ javah Hello

4.
创建Hello.cpp

代码:
pjq@localhost ~/workspace/jni $ cat 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;
}

5.编译生成共享库

代码:
gcc -I$JAVA_HOME/include -I$JAVA_HOME/include/linux -fPIC -c Hello.cpp
代码:
gcc -shared -Wl,-soname,libhello.so.1 -o libhello.so.1.0 Hello.o
代码:
cp libhello.so.1.0 libhello.so
export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH

6.创建测试JAVA程序

代码:
import Hello;
import java.util.*;
public class ToSay
{
public static void main(String argv[])
{
ToSay say = new ToSay();
}
public ToSay()
{
Hello h = new Hello();
//调用本地方法向John问好
h.SayHello("John");
}
}

编译,出现错误:

代码:
pjq@localhost ~/workspace/jni $ javac ToSay.java
ToSay.java:2: 需要 ‘.’
import Hello;
^
ToSay.java:2: 需要 ‘;’
import Hello;
^
ToSay.java:4: 需要为 class、interface 或 enum
import java.util.*;
^
3 错误

解决方法:将import Hello;注掉:

代码:
pjq@localhost ~/workspace/jni $ cat ToSay.java//import Hello;

import java.util.*;

public class ToSay
{
public static void main(String[]argv)
{
Hello h = new Hello();
h.SayHello("John");
}
public ToSay()
{
}
}

编译执行:

代码:
pjq@localhost ~/workspace/jni $ javac ToSay.java
pjq@localhost ~/workspace/jni $ java ToSay
Hello,John
在Linux平台下使用JNI,我的操作过程

One thought on “在Linux平台下使用JNI,我的操作过程

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.