`
eagle0824
  • 浏览: 231566 次
  • 性别: 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
原因:在最后面加个回车
分享到:
评论

相关推荐

    Android Studio JNI编程入门实例

    通过以上步骤,你已经成功实现了Android Studio中的JNI编程入门。然而,这只是基础,实际开发中可能需要处理更复杂的情况,如多线程、内存管理、错误处理等。同时,CMakeLists.txt作为现代的构建系统,提供了更多...

    jni快速入门实例

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

    Android jni 编程实例

    在这个"Android jni 编程实例"中,我们将探讨如何在Android Studio环境下进行JNI开发,通过一个简单的入门demo来学习这个过程。 首先,我们需要了解JNI的基本概念。JNI是Java平台提供的一种接口,它允许Java代码...

    Android Studio JNI开发入门教程

    Android Studio的JNI(Java Native Interface)开发入门教程 JNI,全称为Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在Android开发中扮演着重要角色,尤其当...

    jni的简单入门实例

    ### JNI的简单入门实例 JNI(Java Native Interface)是一种标准的接口规范,它允许Java代码与其他语言编写的代码进行交互,比如C、C++等。JNI对于开发高性能应用或者调用本地库非常有用。下面将根据提供的文件内容...

    JNI入门Demo1.0

    通过学习和实践这个JNI入门Demo1.0,你可以掌握JNI的基本用法,包括声明`native`方法、生成头文件、编写C++代码以及构建和加载动态库。这将为你进一步探索Android的原生开发打下基础,比如使用C++提升性能、接入第三...

    java jni从入门到精通

    - **直接调用**:通过JNIEnv指针,可以调用Java的静态和实例方法,包括同步和异步方法。 - **回调Java方法**:本地代码可以通过`CallVoidMethod`, `CallNonvirtualVoidMethod`等函数,回调Java对象的方法。 7. **...

    ndk jni实例源码

    本实例源码"hellojni"是一个典型的NDK和JNI的入门示例,它将帮助我们理解如何在Android项目中集成和使用本地代码。 1. **NDK**:NDK是一套工具集,它提供了编译、构建和运行原生代码的环境。通过NDK,开发者可以在...

    adt-bundle JNI NDK 初学者实例

    在提供的压缩包`myJni`中,很可能包含了一个简单的JNI实例,比如一个简单的"Hello, World!"程序,或者是演示如何从Java调用C++函数的例子。通过学习这个实例,初学者可以更好地理解如何在Android应用中集成本地代码...

    JNI的入门开发

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

    Android NDK入门 实例 详解

    本教程将深入浅出地介绍Android NDK的入门知识,并通过实例帮助你理解和掌握其核心概念。 ### NDK的用途 1. **性能优化**:对于计算密集型任务,如图像处理、游戏引擎、物理模拟等,使用C/C++可以提高运行效率。 2...

    android jni实例

    本实例是一个面向初学者的JNI开发入门教程,通过具体的项目"JniDemo",将帮助你理解JNI的基本概念和应用。 在Android应用开发中,JNI主要应用于以下几个场景: 1. **性能优化**:对于计算密集型任务,如图像处理、...

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

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

    hello-jni.rar_ android jni_android hello jni_android jni hellojn

    《Android NDK与JNI开发详解:从Hello-JNI入门》 Android系统以其开源性和灵活性吸引了大量的开发者,而JNI(Java Native Interface)则是Android平台中连接Java层与原生C/C++代码的重要桥梁。JNI允许开发者在...

    jni-helloWorld

    在"jni-helloWorld"这个项目中,我们看到的是一个JNI的入门示例,主要目的是帮助开发者理解如何使用JNI来调用本地(非Java)代码。 首先,"HelloWorld"是编程中的经典例子,通常用于展示一种新语言或技术的基本用法...

    MTK平台入门MMI实例培训教程

    本教程《MTK平台入门MMI实例培训教程》旨在帮助开发者理解和掌握在MTK平台上进行MMI设计与开发的基本技巧和流程。以下是对该教程内容的详细概述: 1. MTK平台简介: MTK平台以其高性能、低功耗的特点受到众多设备...

    jni.rar_JNI编程_java jni_jni_site:www.pudn.com

    本资料集主要针对JNI编程,适合初学者入门。 1. **JNI基础概念** JNI是一种规范,定义了Java虚拟机(JVM)如何与本地代码(非Java)交互。这种交互包括加载本地库、调用本地方法、传递数据等。JNI提供了丰富的API...

    JNI编程指南1

    2. **全面介绍**:第三至第十章系统地阐述了JNI的各种特性,通过丰富的实例详细讲解了如何使用JNI进行Java和本地代码的交互。这些章节深入探讨了JNI接口的使用,包括如何声明和实现本地方法,以及如何处理数据类型和...

Global site tag (gtag.js) - Google Analytics