JNI开发心得笔记系列(一)
来源:互联网 发布:dota 数据 编辑:程序博客网 时间:2024/05/17 07:22
Java中的类转化到C语言中的结构体
参考DEMO:http://blog.csdn.net/yf210yf/article/details/12112293
***********************************************************************
Javah的使用方法,常见的有两种情形:
(情形1)在bin/classes目录下面,javah -jni com.example.jni.HelloJni
( 包名 )( 类名 )
(情形2)直接在src目录下面,javah com.example.jni.HelloJni
( 包名 )( 类名 )
***********************************************************************
***************************************************************************************
ndk-build :
1、首先生成Android项目,使其下面出现bin文件夹,并且包含classes文件夹
2、在bin/classes文件夹下面直接调用 ndk-build;
3、出现如下所示表示编译成功;
daqin@ubuntu:~/workspace/workspace_android/TEngine/bin/classes$ ndk-build
[armeabi] Compile thumb : main <= main.c
[armeabi] SharedLibrary : libmain.so
[armeabi] Install : libmain.so => libs/armeabi/libmain.so
daqin@ubuntu:~/workspace/workspace_android/TEngine/bin/classes$
4、每次ndk-build之后,都是需要重新将项目clean一遍,然后重新生成;
修改:ndk-build的编译条件
只要文件夹下面包含jni目录即可;
***************************************************************************************
***********************************************************************
jni中添加日志输出的实现方式:
参考文献:http://blog.csdn.net/jjunjoe/article/details/7020236
http://blog.csdn.net/h3c4lenovo/article/details/10417957
具体的流程:
首先,在Android.mk中添加LOCAL_LDLIBS :=-llog一句话,放在如下位置:
LOCAL_SRC_FILES := main.cpp
LOCAL_LDLIBS :=-llog
其次,在头文件中引入#include <android/log.h>;
最后,直接调用__android_log_print(ANDROID_LOG_INFO, "jni_test", "daqin_test");函数实现日志的输出;
***********************************************************************
***************************************************************************************
常用的头文件包含:
#include <android/log.h>
#include <stdio.h>
#include <stdlib.h>
在stdio.h文件中包含了NULL;
在stdlib.h文件中包含了malloc,memcpy等对字符串操作的函数;
***************************************************************************************
***************************************************************************************
Android编程中如何引入第三方的so库文件,在Android.mk文件中如何写?
另外,存在多个.mk文件如何办?
错误信息:
Android NDK: WARNING:/home/daqin/workspace/workspace_c/WstService/TEngineTool/jni/Android.mk:TEngineTool: non-system libraries in linker flags: -lwsteay10 -lsm13algrithm -lTcUtility -lCryptoLib -lWSESecDvc
Android NDK: This is likely to result in incorrect builds. Try using LOCAL_STATIC_LIBRARIES
Android NDK: or LOCAL_SHARED_LIBRARIES instead to list the library dependencies of the
Android NDK: current module
错误信息:
java.lang.UnsatisfiedLinkError: Couldn't load TEngineTool from loader dalvik.system.PathClassLoader[dexPath=/data/app/cn.com.westone.tengine-1.apk,libraryPath=/data/app-lib/cn.com.westone.tengine-1]: findLibrary returned null
原因:是因为没有生成对应so文件;
***************************************************************************************
***************************************************************************************
如何调用别人已经写好的so文件,即使用共享库的方式?
1、在JNI目录下面,新建一个目录:如prebuild,将其对应的*.h文件和*.so文件拷入;
2、添加Android.mk文件,格式如下:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libPrebuild
LOCAL_SRC_FILES := libhello.so
include $(PREBUILT_SHARED_LIBRARY) //使用预编译的共享库的方式
3、在上层目录的Android.mk文件中添加如下内容:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := WstVpnSocket
LOCAL_SHARED_LIBRARIES := libPrebuild //需要引用的共享库
LOCAL_SRC_FILES := WstVpnSocket.c
include $(BUILD_SHARED_LIBRARY)
include $(LOCAL_PATH)/prebuilt/Android.mk //#需要预编译依赖库的头文件
***************************************************************************************
参考DEMO:http://blog.csdn.net/yf210yf/article/details/12112293
***********************************************************************
Javah的使用方法,常见的有两种情形:
(情形1)在bin/classes目录下面,javah -jni com.example.jni.HelloJni
( 包名 )( 类名 )
(情形2)直接在src目录下面,javah com.example.jni.HelloJni
( 包名 )( 类名 )
***********************************************************************
***************************************************************************************
ndk-build :
1、首先生成Android项目,使其下面出现bin文件夹,并且包含classes文件夹
2、在bin/classes文件夹下面直接调用 ndk-build;
3、出现如下所示表示编译成功;
daqin@ubuntu:~/workspace/workspace_android/TEngine/bin/classes$ ndk-build
[armeabi] Compile thumb : main <= main.c
[armeabi] SharedLibrary : libmain.so
[armeabi] Install : libmain.so => libs/armeabi/libmain.so
daqin@ubuntu:~/workspace/workspace_android/TEngine/bin/classes$
4、每次ndk-build之后,都是需要重新将项目clean一遍,然后重新生成;
修改:ndk-build的编译条件
只要文件夹下面包含jni目录即可;
***************************************************************************************
***********************************************************************
jni中添加日志输出的实现方式:
参考文献:http://blog.csdn.net/jjunjoe/article/details/7020236
http://blog.csdn.net/h3c4lenovo/article/details/10417957
具体的流程:
首先,在Android.mk中添加LOCAL_LDLIBS :=-llog一句话,放在如下位置:
LOCAL_SRC_FILES := main.cpp
LOCAL_LDLIBS :=-llog
其次,在头文件中引入#include <android/log.h>;
最后,直接调用__android_log_print(ANDROID_LOG_INFO, "jni_test", "daqin_test");函数实现日志的输出;
***********************************************************************
***************************************************************************************
常用的头文件包含:
#include <android/log.h>
#include <stdio.h>
#include <stdlib.h>
在stdio.h文件中包含了NULL;
在stdlib.h文件中包含了malloc,memcpy等对字符串操作的函数;
***************************************************************************************
***************************************************************************************
Android编程中如何引入第三方的so库文件,在Android.mk文件中如何写?
另外,存在多个.mk文件如何办?
错误信息:
Android NDK: WARNING:/home/daqin/workspace/workspace_c/WstService/TEngineTool/jni/Android.mk:TEngineTool: non-system libraries in linker flags: -lwsteay10 -lsm13algrithm -lTcUtility -lCryptoLib -lWSESecDvc
Android NDK: This is likely to result in incorrect builds. Try using LOCAL_STATIC_LIBRARIES
Android NDK: or LOCAL_SHARED_LIBRARIES instead to list the library dependencies of the
Android NDK: current module
错误信息:
java.lang.UnsatisfiedLinkError: Couldn't load TEngineTool from loader dalvik.system.PathClassLoader[dexPath=/data/app/cn.com.westone.tengine-1.apk,libraryPath=/data/app-lib/cn.com.westone.tengine-1]: findLibrary returned null
原因:是因为没有生成对应so文件;
***************************************************************************************
***************************************************************************************
如何调用别人已经写好的so文件,即使用共享库的方式?
1、在JNI目录下面,新建一个目录:如prebuild,将其对应的*.h文件和*.so文件拷入;
2、添加Android.mk文件,格式如下:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libPrebuild
LOCAL_SRC_FILES := libhello.so
include $(PREBUILT_SHARED_LIBRARY) //使用预编译的共享库的方式
3、在上层目录的Android.mk文件中添加如下内容:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := WstVpnSocket
LOCAL_SHARED_LIBRARIES := libPrebuild //需要引用的共享库
LOCAL_SRC_FILES := WstVpnSocket.c
include $(BUILD_SHARED_LIBRARY)
include $(LOCAL_PATH)/prebuilt/Android.mk //#需要预编译依赖库的头文件
***************************************************************************************
0 0
- JNI开发心得笔记系列(一)
- JNI开发基础入门系列(一)
- [JNI]学习笔记系列:一
- JNI 学习笔记系列(一)
- JNI学习系列(一)
- Spring项目开发笔记系列(一)
- JNI 开发技术 (一)
- JNI NDK开发(一)
- Android JNI开发(一)
- JNI开发基础(一)
- android JNI 系列 一
- IBatis开发心得(一)
- 软件开发心得(一)
- android开发心得(一)
- Android开发心得(一)
- Jni开发与Android NDK开发学习笔记(一)
- JNI笔记 JNI开发流程
- JNI和NDK编程(一)JNI的开发流程
- 数组搜索(search)之线性搜索与二分法搜索
- 各种工业以太网比较(EtherCAT,EtherNet/IP,ProfiNet,Modbus-TCP,Powerlink)
- 验证手机号是否正确
- ListView以及常用Adapter使用总结
- HTML5笔记
- JNI开发心得笔记系列(一)
- 上机题-字符个数统计
- 理解 LSTM 网络
- 安卓接入融云即时通讯的简单步骤
- Appium+Maven+TestNG(ReportNG)环境搭建(详细过程)
- Android XML Editor cannot process this input
- 汇编语言学习第十一章-标志寄存器
- 手机端的META你有多了解?
- 算法的性质