windows下使用cmake和ndk编译android所用动态库.so和静态库.a

来源:互联网 发布:页面加载速度优化 编辑:程序博客网 时间:2024/05/22 18:55

      不在linux上编译android所用.a和.so,在windows上如何编译呢?

 1.准备工作:

1.vs2008,别的版本vs应该也可以,我用的就是2008;

2.cmake,下载个最新的版本,装上,安装好后把bin目录加入环境变量;

3.ndk,最新版本是ndk10了,附上下载地址https://developer.android.com/tools/sdk/ndk/index.html;

4.工具链,没这个玩不转,也附上下载地址:https://github.com/taka-no-me/android-cmake/archive/master.zip

感谢人家,俺还不会写。

 

 2.开始写一点点代码

使用java声明个native函数:

package android.jni.test;public class NativeClassT {public native static int test(int value);}


在src统计目录下新建个jni文件夹,在里边定义本地函数,头文件可以使用javah工具生成;

直接贴出来了,android_jni_test_NativeClassT.h

/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class android_jni_test_NativeClassT */#ifndef _Included_android_jni_test_NativeClassT#define _Included_android_jni_test_NativeClassT#ifdef __cplusplusextern "C" {#endif/* * Class:     android_jni_test_NativeClassT * Method:    test * Signature: (I)I */JNIEXPORT jint JNICALL Java_android_jni_test_NativeClassT_test  (JNIEnv * env, jclass claszz, jint val);#ifdef __cplusplus}#endif#endif


android_jni_test_NativeClassT.cppandroid_jni_test_NativeClassT.cppandroid_jni_test_NativeClassT.cppandroid_jni_test_NativeClassT.cppandroid_jni_test_NativeClassT.cpp

#include "android_jni_test_NativeClassT.h"JNIEXPORT jint JNICALL Java_android_jni_test_NativeClassT_test  (JNIEnv * env, jclass claszz, jint val) {return ++va; }

文件名不能随便乱取,是有规律的;

写的太简单了点,就是把传过来的值+1;

 

 3.编译so

写个CMakeLists文件,至于如何写,这里先不说,也是直接上代码CMakelists.txt:

cmake_minimum_required(VERSION 3.1)set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/libs)add_library(libJni SHARED ${SRC_LIST})set_target_properties(libJni PROPERTIES OUTPUT_NAME "JNI")


 此文件放到与c++文件同目录,为了将编译与源码相分离,在此目录新建文件夹build,在里面新建批处理文件build.dat:

set ANDROID_NDK=<NDK根目录>cmake .. -G "NMake Makefiles" -DCMAKE_TOOLCHAIN_FILE=<android.toolchain.cmake文件位置,包含文件名> -DCMAKE_MAKE_PROGRAME=<NDK根目录>/prebuilt/windows/bin/make.exenmake

之后打开vs2005命令行窗口,cd到build.dat目录,运行build批处理文件,OK大功告成,在build文件夹找libs文件夹吧,看看里边有没有一个叫libJNI.so的文件

在android中加载它,并调用native函数试试看,结果是不是加了1

 

 ps:为了节省时间, 用的例子基本上都是最简单的,复杂的情况大家可以自己扩展;一些东西也没有介绍,例如CMakelists.txt如何写,jni头文件如何生成,不过这些网上有很多。大家可以百度之,很多人写的非常好。有时间我也总结总结;




 

 

0 0
原创粉丝点击