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


























       
0 0
原创粉丝点击