`
eagle0824
  • 浏览: 227666 次
  • 性别: Icon_minigender_1
  • 来自: 镇江
社区版块
存档分类
最新评论

jni 入门实例

阅读更多
jni HelloWorld实例

1.编写一个HelloWorld.java
class HelloWorld{

	public native void print();

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

	static{
		System.out.println(System.getProperty("java.library.path"));
		System.loadLibrary("HelloWorld");
	}
}


2.编译javac HelloWorld.java

3.生成头文件javah -jni HelloWorld

4.编写HelloWord.c文件
#include<jni.h>
#include<stdio.h>
#include"HelloWorld.h"

JNIEXPORT void JNICALL Java_HelloWorld_print
  (JNIEnv *env, jobject obj){
  	printf("HelloWorld!\n");
	return;
  };
int main(){
	return 0;
}



5.编译C程序
gcc -shared HelloWorld.c -I/home/archermind/jdk1.6.0_22/include -I/home/archermind/jdk1.6.0_22/include/linux -o libHelloWorld.so

7.执行java HelloWorld
死都会报下面的错(如果用IDE就不会有问题)
Exception in thread "main" java.lang.UnsatisfiedLinkError: displayHelloWorld
        at HelloWorld.displayHelloWorld(Native Method)
        at HelloWorld.main(HelloWorld.java:9)
使用dll export view查看生成的HelloWorld.dll文件发现生成的方法名为Java_HelloWorld_displayHelloWorld@8      
使用下面的语句搞定,通过-Djava.library.path=.把当前路径中的so库添加到library路径中
java -Djava.library.path=. HelloWorld

附常见问题
1.
archermind@rdjdz11025:~/jnitest$ gcc HelloWorld.c -o libHelloWorld.so

HelloWorld.c:1:16: error: jni.h: No such file or directory
In file included from HelloWorld.c:3:
HelloWorld.h:15: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘void’
HelloWorld.c:5: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘void’

原因:没找到jni.h添加-I/home/archermind/jdk1.6.0_22/include -I/home/archermind/jdk1.6.0_22/include/linux到编译路径中来
可以用以下命令gcc HelloWorld.c -I/home/archermind/jdk1.6.0_22/include -I/home/archermind/jdk1.6.0_22/include/linux -o libHelloWorld.so

2.
archermind@rdjdz11025:~/jnitest$ gcc HelloWorld.c -I/home/archermind/jdk1.6.0_22/include -I/home/archermind/jdk1.6.0_22/include/linux -o libHelloWorld.so
/usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 0 has invalid symbol index 12
/usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 1 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 2 has invalid symbol index 2
/usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 3 has invalid symbol index 2
/usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 4 has invalid symbol index 12
/usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 5 has invalid symbol index 14
/usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 6 has invalid symbol index 14
/usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 7 has invalid symbol index 14
/usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 8 has invalid symbol index 2
/usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 9 has invalid symbol index 2
/usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 10 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 11 has invalid symbol index 14
/usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 12 has invalid symbol index 14
/usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 13 has invalid symbol index 14
/usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 14 has invalid symbol index 14
/usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 15 has invalid symbol index 14
/usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 16 has invalid symbol index 14
/usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 17 has invalid symbol index 14
/usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 18 has invalid symbol index 14
/usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 19 has invalid symbol index 14
/usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 20 has invalid symbol index 14
/usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 21 has invalid symbol index 14
/usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 22 has invalid symbol index 22
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
collect2: ld returned 1 exit status

原因:这就是因为我们没有编写main函数而产生的错误,可以用以下命令编译修复
gcc -shared HelloWorld.c -I/home/archermind/jdk1.6.0_22/include -I/home/archermind/jdk1.6.0_22/include/linux -o libHelloWorld.so

若仍使用原命令编译,则需要在HelloWorld.c添加main函数
int main(){
return 0;
}

3
archermind@rdjdz11025:~/jnitest$ java -Djava.library.path=. HelloWorld
.
Exception in thread "main" java.lang.UnsatisfiedLinkError: /home/archermind/jnitest/libHelloWorld.so: /home/archermind/jnitest/libHelloWorld.so: cannot dynamically load executable
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1803)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1728)
at java.lang.Runtime.loadLibrary0(Runtime.java:823)
at java.lang.System.loadLibrary(System.java:1028)
at HelloWorld.<clinit>(HelloWorld.java:11)
Could not find the main class: HelloWorld.  Program will exit.
原因:出现此问题是因为在出现第2个问题的时候,通过添加main函数解决,而没有在编译的时候添加-shared选项,用以下命令编译时即可解决
gcc -shared HelloWorld.c -I/home/archermind/jdk1.6.0_22/include -I/home/archermind/jdk1.6.0_22/include/linux -o libHelloWorld.so



3
F:\studyInfo\jni>gcc -IC:\Java\jdk1.5.0_09\include -IC:\Java\jdk1.5.0_09\include\win32 -O3 -Wall -c -fmessage-length=0 -oHelloWorld.o HelloWorld.c
HelloWorld.c:14:2: warning: no newline at end of file
原因:在最后面加个回车
分享到:
评论

相关推荐

    jni入门实例

    入门jni最详细清晰地文档,一步步全面的讲解,小学生学会都不成问题,文中还有实例的代码

    Android Studio JNI编程入门实例

    这是一个Android Studio的jni编程入门实例,配置方式简单易懂,本人有相应的博客说明,欢迎交流。

    jni快速入门实例

    jni快速入门实例,java文件里写了几个函数,参数包含了常用的数据类型、类、数组等。对应的有C的实现和C++的实现,并且两者混编在一起,生成一个so。有Makefile。基本上涵盖了jni开发用到的基本技术。原创资源。

    Android jni 编程实例

    android studio 中 进行 JNI 开发的一个简单实例,入门demo

    jni的简单入门实例

    这篇文章是对jni的简单测试,使用该测试可以迅速的入门jni

    JNI使用实例

    一个JNI入门的使用实例 android 的应用程序(Dalvik VM)中使用JNI(Java Native Interface)调用C/C++开发的共享库

    android_JNI实例

    androidJNI初始入门基础案例 androidJNI操作指南

    JNI的入门开发

    JNI的入门开发,其中包含我个人的理解和实例,肯定对大家有帮助、 很好的学习例子

    JNI的使用实例与讲解(初学必备)

    java调用VC++编写的动态链接库dll,文档中写了三个例子,①简单的入门小例子 ②java传整型数给dll,返回整型数,③java传两个整型数,返回整型数组,每个例子都有详细的说明,帮助初学者理解JNI的使用流程和原理!...

    JNI快速实现入门(java调用C++程序的方法)

    JNI是java调用C++程序的一种实现方法,网上有一些相关的资料,但不一定能适用,这个文档我在学习JNI时综合网上资料总结的,本人亲测能够实现,希望下载的网友有什么问题多多反馈,希望对学习JNI的朋友有所帮助

    android jni实例

    非常简单易懂的android JNI开发入门级别demo,适合初学者

    Android驱动开发实例

    1:Android通过JNI调用驱动程序(完全解析实例) 2:Android驱动开发入门及手机案例开发分析.pdf 3:android_hal.pdf 4:Android通过JNI调用驱动程序(完全解析实例)

    JAVA上百实例源码以及开源项目源代码

     Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...

    android ndk开发实例代码

    android ndk 开发入门小例子。 博客地址http://blog.csdn.net/u014702653/article/details/51861013

    Android 4游戏编程入门经典

     7.12.6 减少opengl es/jni方法的调用  7.12.7 绑定顶点的概念  7.12.8 写在结束之前  7.13 小结 第8章 2d游戏编程技巧  8.1 写在开始  8.2 向量  8.2.1 使用向量  8.2.2 一点三角学的知识  8.2.3 实现一个...

    JAVA上百实例源码以及开源项目

     Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...

    Cocos2d-x入门教程(详细的实例和讲解)

    作为入门级选手,2D游戏显然更适合上手一些,另外适合果果这个年龄段的幼教类的游戏也多以2D游戏居多。3D游戏本身也太难了,不仅要 Programming能力,还要3D建模能力,这些学习起来周期就太长了;一直是Ubuntu Fans...

    Android 初学中阶高阶书籍_集合打包2

    巧,android_jni操作指南,Android_NDK开发实例,Android_RIL层剖析(官方翻译),Android2.2+API+中文文档系列,Android的 Message机制(简单小结). Android的主题和风格介绍,Android开发环境搭建,Android内存泄露调试,...

Global site tag (gtag.js) - Google Analytics