JNI错误问题。

简介: filed in java post by onelong on2010-8-29 16:30 Sunday java代码如下://HelloWorld.

filed in java post by onelong on2010-8-29 16:30 Sunday

java代码如下:
//HelloWorld.java
public class HelloWorld{
  public native void displayHelloWorld();
   static {
      System.loadLibrary("hello"); 
  }

  public static void main(String[] args) {
    new HelloWorld().displayHelloWorld();
 }
}
javac HelloWorld.java 编译文件

javah HelloWorld 生成HelloWorld.h文件,内容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class HelloWorld */

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

#ifdef __cplusplus
}
#endif
#endif


新建并编写 HelloWorld.c,内容如下:

#include
#include "HelloWorld.h"

JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject job)
{
 printf("Hello world!\n");
}
接下来就是编译啦!问题也跟着来了!
编译命令:注意-》gcc -I /usr/lib/jvm/java-6-sun/include -I /usr/lib/jvm/java-6-sun/include/linux -fPIC -shared -o libhello.so HelloWorld.c
不要使用-c参数!否则会出错的!什么错误呢?

Exception in thread "main" java.lang.UnsatisfiedLinkError: /home/hl/libhello.so: /home/hl/libhello.so: only ET_DYN and ET_EXEC can be loaded
 at java.lang.ClassLoader$NativeLibrary.load(Native Method)
 at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1750)
 at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1675)
 at java.lang.Runtime.loadLibrary0(Runtime.java:840)
 at java.lang.System.loadLibrary(System.java:1047)
 at HelloWorld.(Helloworld.java:7)
Could not find the main class: HelloWorld. Program will exit.
接下来就是运行了!这个也是问题多多的环节:
java Helloworld

java.lang.UnsatisfiedLinkError: no hello in java.library.path           
 at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1682)           
 at java.lang.Runtime.loadLibrary0(Runtime.java:822)           
 at java.lang.System.loadLibrary(System.java:992)           
 at HelloWorld.main(HelloWorld.java:17)

系统提示,找不到了库!怎样解决呢?修改环境变量
在你的主目录(我的是/home/hl)找到.bashrc文件编辑它(ls -a)
添加:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/hl
其中/home/hl是你想设定的路径,用于放库文件的目录。
hl@hl-desktop:~$ env
看看你设定的环境变量存不存在!如果存在就ok了!
LD_LIBRARY_PATH=:/home/hl
把生成的libhello.so文件复制到你你设定的路径接下来运行!

java Hello world
结果出来了!!
Hello world!
一个完整的Hello world也完成了!但是还是想多说点!
注意:一定要将linux下的动态库(共享库)命名成libxxx.so的形式,"xxx"是你在System.loadLibrary("xxx")中用到的加载库名称。
和gcc 怎样生成动态的库命令!这里不多说了!

目录
相关文章
源文件与模块生成时的文件不同,是否希望调试器使用它?如何解决
源文件与模块生成时的文件不同,是否希望调试器使用它?如何解决
|
存储 IDE Java
NDK 系列(6):说一下注册 JNI 函数的方式和时机
NDK 系列(6):说一下注册 JNI 函数的方式和时机
125 0
NDK 系列(6):说一下注册 JNI 函数的方式和时机
JNI中访问JList的代码
JNI中访问JList的代码
62 0
|
Java 编译器 C++
JNI编程怎么跟踪调试dll?
本文主要讲解一下在jni开发中,如何调试C/C++编写的DLL模块。
455 0
JNI编程怎么跟踪调试dll?
|
Android开发
【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 获取 远程 目标进程 中的 /system/lib/libc.so 动态库中的 mmap 函数地址 )
【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 获取 远程 目标进程 中的 /system/lib/libc.so 动态库中的 mmap 函数地址 )
271 0
【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 获取 远程 目标进程 中的 /system/lib/libc.so 动态库中的 mmap 函数地址 )
|
Java 视频直播 Shell
android开发 加载so库的解析和出现的各种错误分析
android开发 加载so库的解析和出现的各种错误分析
android开发 加载so库的解析和出现的各种错误分析
|
开发工具 C++ Kotlin
c++文件中jni库找不到报红
本来没有问题的一个项目,有一天打开后c++文件中jni库都报红,但是并不影响运行,但是非常影响开发。
597 0
|
Android开发
【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 三 | 等待远程函数执行完毕 | 寄存器获取返回值 )
【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 三 | 等待远程函数执行完毕 | 寄存器获取返回值 )
169 0
|
Android开发
【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 二 | 准备参数 | 远程调用 mmap 函数 )
【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 二 | 准备参数 | 远程调用 mmap 函数 )
138 0
|
Java Linux Android开发
【Android 逆向】Android 进程注入工具开发 ( 远程进程注入动态库文件操作 | 注入动态库 加载 业务动态库 | 业务动态库启动 | pthread_create 线程开发 )
【Android 逆向】Android 进程注入工具开发 ( 远程进程注入动态库文件操作 | 注入动态库 加载 业务动态库 | 业务动态库启动 | pthread_create 线程开发 )
196 0