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 //#需要预编译依赖库的头文件
***************************************************************************************