当前位置:  编程技术>移动开发
本页文章导读:
    ▪jni 入门范例        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.li.........
    ▪ Objective-c中@class跟#import的区别        Objective-c中@class和#import的区别 二者的区别在于:1.import会包含这个类的所有信息,包括实体变量和方法,而@class只是告诉编译器,其后面声明的名称是类的名称,至于这些类是如何定义的.........
    ▪ 聊java的导入(import)       谈java的导入(import) 单类型导入(single-type-import),例如import java.io.File;  按需类型导入(type-import-on-demand),例如 import java.io.*;  关于这两种导入类型大家各有所爱,众说纷纭。这.........

[1]jni 入门范例
    来源: 互联网  发布时间: 2014-02-18
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
原因:在最后面加个回车

    
[2] Objective-c中@class跟#import的区别
    来源: 互联网  发布时间: 2014-02-18
Objective-c中@class和#import的区别
二者的区别在于:
1.import会包含这个类的所有信息,包括实体变量和方法,而@class只是告诉编译器,其后面声明的名称是类的名称,至于这些类是如何定义的,暂时不用考虑,后面会再告诉你。
2.在头文件中, 一般只需要知道被引用的类的名称就可以了。 不需要知道其内部的实体变量和方法,所以在头文件中一般使用@class来声明这个名称是类的名称。 而在实现类里面,因为会用到这个引用类的内部的实体变量和方法,所以需要使用#import来包含这个被引用类的头文件。
3.在编译效率方面考虑,如果你有100个头文件都#import了同一个头文件,或者这些文件是依次引用的,如A–>B, B–>C, C–>D这样的引用关系。当最开始的那个头文件有变化的话,后面所有引用它的类都需要重新编译,如果你的类有很多的话,这将耗费大量的时间。而是用@class则不会。
4.如果有循环依赖关系,如:A–>B, B–>A这样的相互依赖关系,如果使用#import来相互包含,那么就会出现编译错误,如果使用@class在两个类的头文件中相互声明,则不会有编译错误出现。
所以,一般来说,@class是放在interface中的,只是为了在interface中引用这个类,把这个类作为一个类型来用的。 在实现这个接口的实现类中,如果需要引用这个类的实体变量或者方法之类的,还是需要import在@class中声明的类进来.

    
[3] 聊java的导入(import)
    来源: 互联网  发布时间: 2014-02-18
谈java的导入(import)
单类型导入(single-type-import),例如import java.io.File;
  按需类型导入(type-import-on-demand),例如 import java.io.*;
  关于这两种导入类型大家各有所爱,众说纷纭。这里分析一下这两种导入类型的大致工作原理供大家参考。
  单类型导入比较好理解,仅仅导入一个public类或者接口。而对于按需类型导入,有人误解为导入一个包下的所有类,其实不然,看名字就知道,他只会按需导入,也就是说它并非导入整个包,而仅仅导入当前类需要使用的类。
  既然如此是不是就可以放心的使用按需类型导入呢?非也,非也。因为单类型导入和按需类型导入对类文件的定位算法是不一样的。
  java编译器会从启动目录(bootstrap),扩展目录(extension)和用户类路径下去定位需要导入的类,而这些目录仅仅是给出了类的顶层目录。编译器的类文件定位方法大致可以理解为如下公式:
  顶层路径名 \ 包名 \ 文件名。class = 绝对路径
  对于单类型导入很简单,因为包明和文件名都已经确定,所以可以一次性查找定位。
  对于按需类型导入则比较复杂,编译器会把包名和文件名进行排列组合,然后对所有的可能性进行类文件查找定位。例如:
  package com;
  import java.io.*;
  import java.util.*;
  当你的类文件中用到了File类,那么可能出现File类的地方如下:
  1、File \\ File类属于无名包,就是说File类没有package语句,编译器会首先搜索无名包
  2、com.File \\ File类属于当前包
  3、java.lang.File \\编译器会自动导入java.lang包
  4、java.io.File
  5、java.util.File
  需要注意的地方就是,编译器找到java.io.File类之后并不会停止下一步的寻找,而要把所有的可能性都查找完以确定是否有类导入冲突。假设此时的顶层路径有三个,那么编译器就会进行3*5=15次查找。
  了解以上原理之后,我们可以得出这样的结论:按需类型导入是绝对不会降低Java代码的执行效率的,但会影响到Java代码的编译速度。
  查看JDK的源代码就知道SUN的软件工程师一般不会使用按需类型导入。因为使用单类型导入至少有以下两点好处:
  1.提高编译速度。
  2.避免命名冲突。(例如:当你import java.awt.*;import java.util.*后,使用List的时候编译器将会出编译错误)
  当然,使用单类型导入会使用你的import语句看起来很长。

    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3