我的 so

来源:互联网 发布:java websocket服务器 编辑:程序博客网 时间:2024/06/06 05:01
环境 window + linux
工具 eclipse +源码环境


1.使用eclipse 编写 Java
package com.android.jni;


public class IswJavaNativeInterface {

    static {
           System.loadLibrary("JNIIsw");
    }


    /*AES*/
    public native byte[] encrypt(byte[] key, byte[] parameters, int len);
    public native byte[] decrypt(byte[] key, byte[] parameters, int len);
}


这里面要注意的是,对于so文件名中的lib字段。mk文件中指定生成libJNIIsw.so,但是这里load时要去掉lib。


2.JavaH 生成 头文件(*.h)
javah本事 jdk的一个命令,但是做这一步时折腾了很久,只说一下必须注意的地方:
写好java文件后,用eclipse编译,在bin/classes 下会生成对应的*.class文件(执行javah命令就是依据这个class编译头文件的)
这里要注意的是,必须cd到 ../bin/classes/ 下面
命令必须是 javah classpath . 包名加类名
否则各种失败,解释下 命令行中的 ‘.’,它的意思是 会在../bin/classes/下生成响应的 头文件。


3.以C的方式实现 头文件中的方法
这里要注意的是,C的文件名必须与生成的头文件一致。include <...>时注意 包含相关库


4.编写Android.mk
将 C文件 java文件 头文件 Android.mk 文件放到一起。
在这个过程中遇到了一个 打印 c 的日志的问题。
要想在eclipse打印C 的日志 需要注意两个地方
 1>.需要在 C文件里 #include <android/log.h>
    期间试了#include <cutils/log.h> #include <utils/Log.h> 都打不出日志。也许在C++里可以,但C里肯定不行
 2>.需要在Android.mk里加上 
    LOCAL_SHARED_LIBRARIES := liblog libcutils
    LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog
这里还有一个小技巧,用eclipse习惯可通过过滤 TAG 来查看 日志,在C里也可以加上TAG
#define  LOG_TAG    "libenc"
#define  ALOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)


5.放到源码环境下 mm 编译
公司里刚好有编译过得 Androd 源码环境,就用google提供的 编译命令就可编出so库。


6.在源码环境的 ../out/..目录下取出生成的so文件


7.将so文件放入eclipse的lib下参加编译


下面是 Android.mk

=====================================================

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_SRC_FILES:= \
com_android_jni_IswJavaNativeInterface.c

LOCAL_C_INCLUDES:= \
$(JNI_H_INCLUDE)

LOCAL_SHARED_LIBRARIES := liblog libcutils
LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog

LOCAL_PRELINK_MODULE := True
LOCAL_MODULE := libJNIIsw
LOCAL_MODULE_TAGS := optional

include $(BUILD_SHARED_LIBRARY)

=====================================================

0 0
原创粉丝点击