Linux平台gcc和动态共享库的基础知识 收集

-1. http://jyk.xidian.edu.cn/jpkcs/wclqlsy/jiangyi/qian-5.pdf
0. http://hi.baidu.com/pigfanfan/blog/item/e4f884a4e9484ef09152ee42.html/cmtid/0c346d179c2af306c93d6db3

1. http://fly-hyp.iteye.com/blog/213035
怎样创建动态连接库(shared library)/dlls?
2. http://www.iteye.com/topic/261176

3. http://www.iteye.com/wiki/blog/213035

10个最好的pdf库
4. http://coolshell.cn/articles/309.html
步骤:
1.首先在java类里申明native方法
例如:
 
package         com.macleo.jni;
public class    JNITest {

        public native String hello();
        public static void main(String[] args) {
                System.out.println("hell mac main method");

        }
}
  

2.javac 编译上面的JNITest.java,指定当前目录下生成class
javac -d . JNITest.java

于是会生成包结构的目录:com.macleo.jni.JNITest.class

3.用javah在当前目录下生成头文件
生成jni的头文件很麻烦,有时即便是位置不对也会报错。
例如,在jni的目录下会报这样的错:
[email protected] ~/macleo/android.workspace/MyPdfWaterMark/jni $  javah -classpath bin/classes -d jni com.macleo.activity.MyPdfWaterMarkActivity
error: cannot access com.macleo.activity.MyPdfWaterMarkActivity
class file for com.macleo.activity.MyPdfWaterMarkActivity not found
javadoc: error - Class com.macleo.activity.MyPdfWaterMarkActivity not found.
Error: No classes were specified on the command line.  Try -help.
[email protected] ~/macleo/android.workspace/MyPdfWaterMark/jni $  cd ..
[email protected] ~/macleo/android.workspace/MyPdfWaterMark $  javah -classpath bin/classes -d jni com.macleo.activity.MyPdfWaterMarkActivity
[email protected] ~/macleo/android.workspace/MyPdfWaterMark $


退至jni的上级目录,就可以了


javah -d . com.macleo.jni.JNITest

会在当前目录下生成一个com_macleo_jni_JNITest.h的头文件
md,
必须要这样:javah -classpath bin/classes  -d jni com.macleo.jni.JNITestActivity
不能缺少classes这个目录,cd。否则报错,无法生成h文件
4.javah生成头文件内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_macleo_jni_JNITest */

#ifndef _Included_com_macleo_jni_JNITest
#define _Included_com_macleo_jni_JNITest
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_macleo_jni_JNITest
 * Method:    hello
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_macleo_jni_JNITest_hello
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif



5.后续看这里了, http://mycoding.iteye.com/blog/954537


==============================================
build libharu relative content
0.google group about libharu
https://groups.google.com/group/libharu/topics?gvc=2
1. http://stackoverflow.com/questions/9192465/libharu-complied-android-so-but-cant-load-library

2.Android.mk
http://blog.csdn.net/nkmnkm/article/details/7235764
http://www.cnblogs.com/zhangweia/archive/2010/09/16/1828176.html
3.由于libharu是用标准的C写的,所以编译成shared library很简单
https://groups.google.com/group/libharu/browse_thread/thread/1c910b664998bcfe/64bc037e9dd9ab99?lnk=gst&q=compile+ndk#

JNI官方比较全面的说明:
http://en.wikipedia.org/wiki/Java_Native_Interface
http://docs.oracle.com/javase/1.4.2/docs/guide/jni/



JNIExample for Android(pdf资料)
http://android.wooyd.org/JNIExample/files/JNIExample.pdf

如何为嵌入式开发建立交叉编译环境
http://www.ibm.com/developerworks/cn/linux/l-embcmpl/
Ubuntu11.04中搭建交叉编译环境(arm-linux-gcc-4.6.1版本
http://my.oschina.net/u/225867/blog/38473

Linux下查看.so和可执行文件是否debug编译
http://blog.chinaunix.net/uid-24690947-id-3057390.html
linux 动态库文件stripped属性理解
http://blog.csdn.net/bitsjx/article/details/7454805
NDK动态库的调用
http://www.cnblogs.com/zhangweia/archive/2010/09/16/1828176.html
http://www.360doc.com/content/11/0304/15/3700464_98080624.shtml

libharu API
http://libharu.org/wiki/Documentation/API/Document#HPDF_New.28.29

for loop initial declaration used outside C99 mode  解决
加选项: -std=c99
http://blog.csdn.net/eclipser1987/article/details/6359089

编译libharu时libpng install prefix... configure: error: Can't find libpng headers解决
https://groups.google.com/group/libharu/tree/browse_frm/month/2010-08?_done=%2Fgroup%2Flibharu%2Fbrowse_frm%2Fmonth%2F2010-08%3F&



libharu  编译步骤
1.先libpng
configure   
make
install
2.在libharu
   configure --with-png=[libpng安装位置]
  注意libpng安装位置下必须有include目录,内有png.h,才可configure 通过
 
3.这里绝对是学习libharu的好地方。
http://libharu.org/wiki/Documentation/Examples

比较牛了...ANSI C写出pdf的读写库。。。开始敬佩了这个日本人了...

4.由于提前将libharu编译成了shared library,安装到当前目录下的lib了....
故对demo程序的编译,我的命令如下:
gcc -o font_demo font_demo.c lib/libhpdf.dylib lib/libhpdf.a -Iinclude


5.安装libharu到php扩展。。。
http://it.newnew.cn/it47206.aspx

6.不知道怎么回事,libharu 附带的demo的text_demo.c等类似的都会include一个grid_sheet.h,而grid_sheet.h内的print_grid方法没有实现,只是申明了一下,不明就里,总是报错。。。。由于对c不是很熟悉了

[email protected] ~/c.lib/libharu-2.1.0/demo $  gcc -o chfont_demo -O2 -Wall chfont_demo.c  -lhpdf -lpng -lz -lm -lstdc++
chfont_demo.c: In function ‘main’:
chfont_demo.c:57: warning: unused variable ‘y’
Undefined symbols for architecture x86_64:
  "_print_grid", referenced from:
      _main in ccKbPVXn.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
[email protected] ~/c.lib/libharu-2.1.0/demo $ 


浪费2个小时,手动将text_demo.c中的include "grid_sheet.h" 改成 grid_sheet.c",问题解决,编译通过了。。。。。可以顺利生成desktop的pdf了。。。。。

bingo


7.开始输出中文
先打预防针
http://bbs.chinaunix.net/thread-1625692-1-1.html

中文输出:
http://hi.baidu.com/blue_lirenlin/blog/item/d5ed191542af2005c83d6d6f.html
依照上文,修改日文输出,中文就可以用了。。中文输出的例子见本文附件

8.进行JNI修改,编译

http://www.eefocus.com/article/10-08/2075521281836694.html



9.JNI调试
http://blog.sina.com.cn/s/blog_7a4b93580100us8a.html

10.补课
http://hi.baidu.com/pigfanfan/blog/item/e4f884a4e9484ef09152ee42.html/cmtid/0c346d179c2af306c93d6db3
参看上文+实验
shared library
我的理解就是运行时,需要so配合

static library
就是运行时,不需要a配合,删除static library依然可以运行。
-----------------------------------------------------------------
btw:safari的确比chrome在中文字符支持上更完美
http://www.coolunix.com/messages/29025.html
上面的页面chrom乱码,safari没有。
-----------------------------------------------------------------

只要肯找英文的资料着实比中文的资料详实的多了。。。
http://www.steveolyo.com/JNI/JNI.html
这么好的资料,真想打包下载,害怕那天无法访问了。。。

NoResourceFoundExexcption,尽然是EditText的setText方法引起的.......

在百度blog找到了关于JNI_ONLOAD的答案:
http://hi.baidu.com/black/item/2acbdbfffbd969743d198b91


no rule to make target

1.一般是源文件的路径没有指定正确
2.多余了这个语句:LOCAL_PATH := $(call my-dir)

commands commence before first target stop
一般是 缺少 “/" 符号。。。都是Android.mk文件不正确引起的

11.md,100%都是路径的问题和源码p关系都没有,libharu模块成功编译。花了4天时间。。。真不容易啊。

12.jni读写文件
http://blog.csdn.net/conowen/article/details/7525837


13.这东西不错,留着有用
http://code.google.com/p/android-quill/


14.c语言排错
http://welkinchen.pixnet.net/blog/post/13506597-assignment-discards-qualifiers-from-pointer-target-type

引用
這個 warning 錯誤說明, 回傳值是一個 const 的類型,而你聲明使用的那個變數並不是 const, 舉例如下:  u_char *p = pcap_next(**, **);  因為 pcap_next 回傳的是一個 const u_char* ,而這裡適用的卻是 u_char* ,因此編譯器會通知你,這裡有潛在的錯誤。


管用,经典啊

gcc 编译抑制warning : -w
管用
http://topic.csdn.net/u/20101027/09/96b852ba-c1b3-4293-a4e9-9b7a539f40b9.html
Android.mk 中抑制waring只需在LOCAL_CFLAGS处添加-w即可

15.android项目源码
http://www.cnblogs.com/love1025/


16.jni排错
request for member 'FindClass' in something not a structure or union
http://topic.csdn.net/u/20110120/10/ef601a64-27fa-4a80-96be-39dbcb644cbc.html
c和c++对即C++中使用
env->FindClass("java/lang/String")


C中使用

(*env)->FindClass(env, "java/lang/String")


17.jni相对复杂
没有想像中那么简单容易实现
http://java.sun.com/docs/books/jni/html/jniTOC.html

JNI WARNING: threadid=1 using env from threadid=
1. http://stackoverflow.com/questions/8296691/vm-aborting-while-creating-two-threads-in-android-application
2. http://stackoverflow.com/questions/9304185/how-to-call-java-function-from-c
3. http://android-developers.blogspot.com/2011/11/jni-local-reference-changes-in-ics.html

18.这里JNI讲的比较好
http://my.unix-center.net/~Simon_fu/?p=833

19.
如何在JNI编程中使用logCat
http://blog.csdn.net/zgjxwl/article/details/6234025

20.libharu在sdcard生成pdf成功。
     奋战5天的成果,2012.5.29.,开源库libharu牛。

21.从sdcard读取pdf
    我雷哥个去啊。。。。居然不支持pdf的read。。。。操蛋了。。。我
22.libharu 专辑
向libharu库加入自定义字体:
https://groups.google.com/group/libharu/browse_thread/thread/c81f7efe8e6c9dba#

你可能感兴趣的:(linux)