通过把静态库封装到动态库的形式来实现。这个步骤需要在编译过程实现
g++ -g -o libMydll.so -fPIC -shared Mydll.cpp -I/usr/local/jdk1.7.0_17/include -I/usr/local/jdk1.7.0_17/include/linux -I. -I../src/__util -I../src/__xml4nlp -I../src/_split_sentence -I../src/_crfwordsegment -I../src/_svmtagger -I../src/_ner -I../src/_gparser -I../src/_srl -I../src/__ltp_dll -I../thirdparty/crfpp -I../thirdparty/maxent -I../thirdparty/tinyxml -L/root/ltp/lib -L/usr/local/jdk1.7.0_17/jre/lib/i386/client -rdynamic -lmaxent ../lib/libcrfpp.a ../lib/libutil.a ../lib/libltp.a ../lib/libsplitsnt.a ../lib/libcrfwordseg.a ../lib/libpostagger.a -lgparser ../lib/libner.a ../lib/libsrl.a ../lib/libxml4nlp.a -ldl -lpthread ../lib/libboost_regex.a ../lib/libcrfpp.a -lmaxent ../lib/libutil.a ../lib/libtinyxml.a -Wl,-rpath,/root/ltp/lib:/usr/local/jdk1.7.0_17/jre/lib/i386/client
程序编译后会把静态文件都打包到libMydll.so,执行 ll -h libMydll.so 会发现打包后的文件比较大。
注意,要把每个静态库链接到的库文件链接进去,有的库文件被两个以上库使用到,也要写多次。
把静态库链接到动态库还有一种方式,如
g++ -g -o libMydll.so -fPIC -shared Mydll.cpp -I/usr/local/jdk1.7.0_17/include -I/usr/local/jdk1.7.0_17/include/linux -I. -I../src/__util -I../src/__xml4nlp -I../src/_split_sentence -I../src/_crfwordsegment -I../src/_svmtagger -I../src/_ner -I../src/_gparser -I../src/_srl -I../src/__ltp_dll -I../thirdparty/crfpp -I../thirdparty/maxent -I../thirdparty/tinyxml -Wl,-Bstatic -L/root/ltp/lib -lutil -lmaxent -lcrfpp -lltp -lsplitsnt -lcrfwordseg -lpostagger -lgparser -lner -lsrl -lxml4nlp -lboost_regex -Wl,-Bdynamic -ldl -lpthread -Wl,-Bdynamic
但是实测提示没有找到某个symbol,所以如果是编译别人的程序,链接比较多,不推荐
还有一种方式,如果已经有.a静态库,可以吧静态库转换为so文件
把静态库解压(ar -x libxyz.a)编译成动态库
ar -x mylib.a
gcc -shared *.o -o libmaxent.so -lz -lm
如果有很多的静态库要转换,不妨通过脚本实现,如
#!/bin/sh
CLASSPATH="."
JARDIR="../lib1"
if [ -d "$JARDIR" ]; then
for i in "$JARDIR"/*.a; do
ar -x "$i"
gcc -shared *.o -o ${i%*.a}.so
echo ${i%*.a}
rm -f *.o
done
fi
如果程序运行提示没有找到xxx.so,则需要设置LD_LIBRARY_PATH。
还有一些库文件带有数字的,则可以
ln -s libh.so.1.0 libh.so
在当前目录创建动态链接库,另外一个重要的命令ldd
如
ldd xxx.so
,可以查看引用了哪些库
g++编译的一些知识:
选项 -rdynamic 用来通知链接器将所有符号添加到动态符号表中
(目的是能够通过使用 dlopen 来实现向后跟踪)
-Wl 是指示GCC将后面n个逗号分割的参数传递给连接器
-fpic 编译器就生成位置无关目标码.适用于共享库(shared library).
-fPIC 编译器就输出位置无关目标码.适用于动态连接(dynamic linking),即使分支需要大范围转移.
Bdynamic表示链接动态库
-L库搜锁目录
-l加装的库名
-I编译头文件搜索路径
分享到:
相关推荐
在`JNITEST`和`JNI`这两个文件夹中,可能包含了示例代码和编译后的库文件,这些文件可以用于进一步了解和实践JNI的静态和非静态头文件的使用。通过查看和运行这些示例,你可以更深入地理解两种方式的差异以及它们在...
标题中的"DELPHI开发JNI必备 jni.pas"表明这是一个针对Delphi开发者的资源,其中包含的`jni.pas`文件是用Delphi编写的,目的是支持在Delphi项目中使用JNI来调用本地C/C++库或Java方法。`jni.pas`通常会封装JNI的C...
通过以上步骤,我们就可以在Android应用中使用JNI访问Java类的方法,实现Java和C/C++之间的高效通信。这在处理图像处理、游戏引擎、加密算法等高性能需求时特别有用。同时,需要注意的是,过度使用JNI可能会增加代码...
4. **编译本地库**:将实现的C/C++代码编译为动态链接库或静态库,依赖于目标平台。 5. **加载本地库**:在Java代码中使用`System.loadLibrary`加载本地库,使Java虚拟机能够找到并调用本地方法。 值得注意的是,...
要在JNI中访问这个静态变量,我们需要先编写C/C++代码,并在`Android.mk`或`CMakeLists.txt`文件中配置构建规则。这里我们假设你已经创建了一个名为`JniCallStaticField.cpp`的源文件。 在`JniCallStaticField.cpp`...
5. **访问Java对象和数组**:开发者可以通过JNI访问Java对象的字段,也可以创建和操作Java数组,包括基本类型数组和对象数组。 6. **异常处理**:JNI允许本地代码抛出和捕获Java异常,并提供了相应的API。 7. **...
在Linux系统(包括Android)中,.so文件是共享库的扩展名,这些库通常包含了C/C++编译的原生代码,它们提供了Java层无法直接访问的低级功能。Android NDK(Native Development Kit)则是一个工具集,允许开发者使用C...
JNI在Java虚拟机(JVM)中创建了一个桥梁,使得Java代码能够调用本地应用程序接口(API),通常是C或C++编写的库。这种交互方式允许Java程序员利用已有的非Java代码库和操作系统特定的功能。 在JNI编程指南中,通常...
6. 类和对象操作:讲解如何通过JNI访问和操作Java类的静态字段、实例字段,以及如何调用静态方法和实例方法。 7. 多线程支持:讨论在多线程环境中使用JNI的注意事项,包括线程同步和线程局部存储。 8. 动态加载库...
5. **加载和调用**:在Java代码中使用`System.loadLibrary("serial_port")`加载静态库,然后就可以调用定义好的JNI接口进行串口操作。 在HardwareControlerDemo这个项目中,很可能已经封装好了这些步骤,开发者只...
6. **字段和方法的访问**:通过JNI可以访问Java类的字段和方法,包括静态和非静态的。例如,`GetStaticFieldID`用于获取静态字段ID,而`CallVoidMethod`则用来调用无返回值的方法。 7. **异常处理**:JNI提供了异常...
JNI在很多场景下非常有用,比如访问操作系统特定的功能、调用已有的C/C++库或者提高性能关键部分的执行效率。这个"jniAPI JAVA的JNI编写帮助文档"包含了关于如何使用JNI API来开发混合模式的Java应用的详细信息。 ...
总的来说,JNI为Java开发者提供了一种途径,可以利用Java的高级特性同时访问底层系统资源,提高了软件的性能和效率。在Android开发中,JNI常用于优化计算密集型任务、接入硬件设备驱动或使用第三方C库等场景。然而,...
5. **静态字段访问**:压缩包中的`JniUseStaticField`可能是一个示例,展示了如何在JNI中访问Java类的静态字段。在JNI中,可以通过`FindClass`, `GetStaticFieldID`和`GetStatic*Field`(或`SetStatic*Field`)方法...
- 使用NDK的性能优化技术,如静态库链接、代码复用、内存管理等。 - Android Studio提供了对C++代码的调试支持,可以在C++代码中设置断点,查看变量值等。 通过这个"Android JNI使用demo",开发者可以学习到如何...
在Android开发中,JNI扮演着至关重要的角色,尤其是在优化性能、调用系统级库或者利用硬件特性等方面。本资源“jni.zip_Android jni_android_jni_jni android”包含了一份关于Android环境下JNI使用的详细指南。 JNI...
2. 访问硬件:JNI允许直接访问操作系统API,从而实现对硬件设备的直接控制。 3. 提高性能:对于计算密集型任务,本地代码通常比Java更快,JNI提供了这种优化的可能性。 4. 利用系统服务:如文件系统、线程管理等,...
- 本地代码需要访问和修改Java对象的成员变量和类的静态变量时,需要使用JNI提供的接口如`GetObjectField`、`SetObjectField`、`GetStaticObjectField`、`SetStaticObjectField`等。 #### 异常处理 - 在JNI中,本地...
3. 编译和链接:使用`javah`工具自动生成C/C++头文件,然后编写本地方法的实现,最后通过JNI链接器将本地库与Java应用连接起来。 二、JNI环境 1. JNIEnv指针:每个JNI函数的第一个参数是JNIEnv*指针,它是访问Java...
JNI在处理性能敏感的任务,如图形渲染、硬件访问或者与C/C++库集成时,尤其有用。本话题将深入探讨如何在Android中使用JNI进行多线程编程,并实现native方法对Java函数的回调。 1. **JNI基础知识**: - JNI是Java...