`

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的目录下会报这样的错:
mac@MacmatoMacBook.local ~/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.
mac@MacmatoMacBook.local ~/macleo/android.workspace/MyPdfWaterMark/jni $  cd ..
mac@MacmatoMacBook.local ~/macleo/android.workspace/MyPdfWaterMark $  javah -classpath bin/classes -d jni com.macleo.activity.MyPdfWaterMarkActivity
mac@MacmatoMacBook.local ~/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不是很熟悉了

mac@MacmatoMacBook.local ~/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
mac@MacmatoMacBook.local ~/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平台gcc和动态共享库的基础知识

    ### Linux平台gcc和动态共享库的基础知识 在深入探索Linux平台下的GCC编译器与动态共享库的基础知识之前,我们首先要理解GCC(GNU Compiler Collection)不仅是一个编译器,更是一套工具集,用于编译多种编程语言,...

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

    一、Linux 平台 gcc 和动态共享库的基础知识 1)GNU gcc 的编译工具用法 2)动态共享库怎么使用 3)关于 Linux 的动态共享库的设置 二、GCC——C 程序是如何编译成的 三、GCC 使用详解

    linux静态库及动态库创建及使用

    ### Linux静态库及动态库创建及使用 #### 一、基本概念 ##### 1.1 什么是库 在计算机编程领域,**库**(Library)是一系列预编译的代码集合,这些代码通常...这些基础知识对于理解和使用Linux系统中的库非常有帮助。

    Linux下使用动态库小结

    本文旨在介绍Linux下动态库的基础知识及其使用方法。 **1.1 静态库与动态库的区别** - **静态库**: 在编译链接阶段,静态库中的代码会被复制到可执行文件中,成为可执行文件的一部分。这意味着使用静态库编译的...

    Linux静态库和动态库学习总结

    ### Linux静态库与动态库详解 #### 一、引言 在Linux环境下开发软件时,经常需要使用到库文件来实现复杂的功能。这些库文件可以分为两大类:...在实际开发中,了解这些基础知识对于提高开发效率和软件质量至关重要。

    Linux静态动态链接库的创建和使用.pdf

    ### Linux静态与动态链接库的创建及使用 #### 一、引言 在Linux系统中,库文件是...了解这些基础知识对于开发高质量的Linux应用程序至关重要。通过合理选择静态库或动态库,可以根据具体需求优化程序性能和资源利用。

    Linux系统下C语言编程基础知识介绍.pdf

    ### Linux系统下C语言编程基础知识详解 #### 一、源程序编译 在Linux环境下,进行C语言编程的首要步骤是源程序的编译。这一过程通常借助于GNU的GCC(GNU Compiler Collection)编译器完成。GCC不仅支持C语言,还...

    linux编程基础

    Linux编程基础是一个涵盖广泛的主题,包括使用GCC编译器、GDB调试器、动态库的构建以及Makefile的编写。这些是Linux环境下软件开发的重要工具和技术。以下是对这些知识点的详细解释: 1. **GCC(GNU Compiler ...

    gcc linux

    【标题】:“gcc Linux”...以上内容涵盖了与“gcc Linux”相关的多个知识点,包括`gcc`的使用、Linux环境配置、虚拟机网络设置以及基础的Linux工具使用。了解和掌握这些内容对Linux系统的日常使用和开发工作至关重要。

    Linux下的C++标准库

    `libstdc++.so.6.0.13`是`libstdc++`的一个具体版本,其中`.so`表示共享对象(Shared Object),在Linux中就是动态链接库。当程序运行时,如果没有找到所需的动态链接库,可以通过手动将库文件复制到系统库路径(如/...

    动态库的建立

    在Linux环境下,动态库和静态库是软件开发中的两种常见库类型,它们在程序编译链接阶段扮演着重要角色。本文将深入解析动态库的建立过程,同时对比静态库,以帮助读者更好地理解和应用。 #### 静态库与动态库的区别...

    Linux平台上学C语言 PDF格式

    在Linux平台上学习C语言是一项非常有价值的技术挑战,因为C语言是一种基础且强大的编程语言,而Linux作为开源操作系统,为开发者提供了丰富的工具和资源。本文将深入探讨如何在Linux环境下高效地学习C语言,并提供...

    【重点】静态库动态库的制作和使用.docx

    接下来,我们详细介绍了链接库的基础知识。链接库文件是实现了特定功能的函数集合,分为静态链接库和动态链接库。静态库(如在Linux下以`.a`结尾的文件)在编译时会将库代码合并到可执行文件中,使得程序独立,但...

    Linux平台上学C语言.rar

    本文将围绕“Linux平台上学C语言”这个主题,详细讲解相关知识点,帮助初学者或有志于深入Linux环境下的C语言编程者。 首先,C语言是一种强大的、高效的编程语言,它的语法简洁明了,对于理解计算机工作原理和操作...

    Linux操作系统基础教程.pdf

    这个基础教程旨在帮助初学者快速入门Linux,通过学习这些基础知识,可以理解Linux系统的运作机制,并能够熟练地在终端进行日常操作。随着对Linux的深入理解,可以进一步探索更高级的主题,如系统管理、网络服务、...

    Linux开发基础ppt课件.ppt

    本节将从Linux函数库开始,详细介绍Linux开发基础的知识点。 一、Linux函数库 Linux函数库是一个文件,包含了一些编译好的代码和数据,这些编译好的代码和数据可以在事后供其他程序使用。函数库可以使整个程序更加...

Global site tag (gtag.js) - Google Analytics