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

      不在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 
/* Header for class android_jni_test_NativeClassT */

#ifndef _Included_android_jni_test_NativeClassT
#define _Included_android_jni_test_NativeClassT
#ifdef __cplusplus
extern "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=
cmake .. -G "NMake Makefiles" -DCMAKE_TOOLCHAIN_FILE= -DCMAKE_MAKE_PROGRAME=/prebuilt/windows/bin/make.exe
nmake

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

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

 

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




 

 

你可能感兴趣的:(JNI)