安卓2.3版本生成so相关
2018-01-18 09:56
465 查看
转载自http://blog.csdn.net/wb175208/article/details/70155239;
图文非常详细,可操作。
1.创建一个工程,注意一定要勾选上这个Include C++ Support
2.一路点击 【next】点击到最后的时候,采用默认就好了:
3.点击【finish】之后,会报错:NDK not configured
4.右键点击工程名称:open moudule setting
5.把我们提前下载好的NDK,配置上去就可以了,点击【OK】
6.里面已经为我们生成了一个Demo,可以直接运行看看结果,里面有cpp,仅供参考:
还可以找到我们生成的so文件
7.但是呢,很多时候我们是不用demo的,我们需要自己手写自己的.h和.cpp文件。那我们就修改一下原来的文件。首先修改生成的so的名称和链接使用的名称:把原来的native-lib改为Tes
4000
tCpp
8.新建一个本地类文件TestCpp.java,并且引用我们新建的so库,红色报错也不要着急
点击Ctrl+E,选择第一个AS会自动帮我们生成实现
9.下面我们就直接测试一下看看是不是我们想要的结果。so文件我们需要release版本的。PS:(Debug版本和release版本,做个C++的都知道。debug版本是调试的使用的,里面包含很多的调试信息,文件体积也是比较大;release版本发布的时候使用的,会自动的去除掉里面的调试信息,文件体积比较小)。通过Gradle projects生成release版本:
然后在这个位置就可以找到我们的release版本的so文件
10.新建一个module来测试我们生成的so文件,然后把我们需要的so文件和TestCpp拷贝测试module中:
注意:TestCpp包名路径名必须和原来的保持一致
还需要添加这部分内容:
11.查看效果:
这样就已经到达我们需要的效果了。
12.但是C++是需要.h文件和.cpp文件配合之后的,如果我要添加新的c++类怎么办呢?
那我们就添加一个C++类:
Test.h
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Test.cpp
2
3
4
5
6
7
8
9
10
11
12
13
添加一个native-lib.h文件
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
native-lib.cpp
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
并且修改CMakeLists.txt文件,把我们需要编译的文件添加进去
13.重新编译so库文件,拷贝到测试的module中,并且修改TestCpp.java文件
OK!完成!
图文非常详细,可操作。
1.创建一个工程,注意一定要勾选上这个Include C++ Support
2.一路点击 【next】点击到最后的时候,采用默认就好了:
3.点击【finish】之后,会报错:NDK not configured
4.右键点击工程名称:open moudule setting
5.把我们提前下载好的NDK,配置上去就可以了,点击【OK】
6.里面已经为我们生成了一个Demo,可以直接运行看看结果,里面有cpp,仅供参考:
还可以找到我们生成的so文件
7.但是呢,很多时候我们是不用demo的,我们需要自己手写自己的.h和.cpp文件。那我们就修改一下原来的文件。首先修改生成的so的名称和链接使用的名称:把原来的native-lib改为Tes
4000
tCpp
8.新建一个本地类文件TestCpp.java,并且引用我们新建的so库,红色报错也不要着急
点击Ctrl+E,选择第一个AS会自动帮我们生成实现
9.下面我们就直接测试一下看看是不是我们想要的结果。so文件我们需要release版本的。PS:(Debug版本和release版本,做个C++的都知道。debug版本是调试的使用的,里面包含很多的调试信息,文件体积也是比较大;release版本发布的时候使用的,会自动的去除掉里面的调试信息,文件体积比较小)。通过Gradle projects生成release版本:
然后在这个位置就可以找到我们的release版本的so文件
10.新建一个module来测试我们生成的so文件,然后把我们需要的so文件和TestCpp拷贝测试module中:
注意:TestCpp包名路径名必须和原来的保持一致
还需要添加这部分内容:
11.查看效果:
这样就已经到达我们需要的效果了。
12.但是C++是需要.h文件和.cpp文件配合之后的,如果我要添加新的c++类怎么办呢?
那我们就添加一个C++类:
Test.h
// // Created by aaa on 2017/4/12. // #ifndef LATINIME_TEST_H #define LATINIME_TEST_H #include <string> using namespace std; class MyTest { public: int testAdd(int a, int b); std::string get_str(); }; #endif //LATINIME_TEST_H1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Test.cpp
// // Created by aaa on 2017/4/12. // #include "Test.h" std::string MyTest::get_str() { return "asdsgfdshgf"; } int MyTest::testAdd(int a, int b) { return a + b; }1
2
3
4
5
6
7
8
9
10
11
12
13
添加一个native-lib.h文件
// // Created by aaa on 2017/4/12. // #ifndef LATINIME_NATIVE_LIB_H #define LATINIME_NATIVE_LIB_H #include <jni.h> #include <string> #include "Test.h" #ifdef __cplusplus extern "C" { #endif extern MyTest gTest; JNIEXPORT jstring JNICALL Java_com_ime_aaa_testcplus_TestCpp_testGetString(JNIEnv *env, jclass type, jstring str_); JNIEXPORT jint JNICALL Java_com_ime_aaa_testcplus_TestCpp_testAdd(JNIEnv *env, jclass type, jint a, jint b); #ifdef __cplusplus } #endif #endif //LATINIME_NATIVE_LIB_H1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
native-lib.cpp
#include "native-lib.h" //定义一个全局变量 MyTest gTest; /** * C字符串转java字符串 */ jstring strToJstring(JNIEnv *env, const char *pStr) { int strLen = strlen(pStr); jclass jstrObj = env->FindClass("java/lang/String"); jmethodID methodId = env->GetMethodID(jstrObj, "<init>", "([BLjava/lang/String;)V"); jbyteArray byteArray = env->NewByteArray(strLen); jstring encode = env->NewStringUTF("utf-8"); env->SetByteArrayRegion(byteArray, 0, strLen, (jbyte *) pStr); return (jstring) env->NewObject(jstrObj, methodId, byteArray, encode); } /** * jstring -> UTF-8 */ char *jstringToUTF8(JNIEnv *env, jstring jstr) { char *rtn = NULL; jclass clsstring = env->FindClass("java/lang/String"); jstring strencode = env->NewStringUTF("utf-8"); jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B"); jbyteArray barr = (jbyteArray) env->CallObjectMethod(jstr, mid, strencode); jsize alen = env->GetArrayLength(barr); jbyte *ba = env->GetByteArrayElements(barr, JNI_FALSE); if (alen > 0) { rtn = (char *) malloc(alen + 1); memcpy(rtn, ba, alen); rtn[alen] = 0; } env->ReleaseByteArrayElements(barr, ba, 0); return rtn; } JNIEXPORT jstring JNICALL Java_com_ime_aaa_testcplus_TestCpp_testGetString(JNIEnv *env, jclass type, jstring str_) { char *ch = jstringToUTF8(env, str_); return env->NewStringUTF(ch); } JNIEXPORT jint JNICALL Java_com_ime_aaa_testcplus_TestCpp_testAdd(JNIEnv *env, jclass type, jint a, jint b) { return gTest.testAdd(a, b); }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
并且修改CMakeLists.txt文件,把我们需要编译的文件添加进去
13.重新编译so库文件,拷贝到测试的module中,并且修改TestCpp.java文件
OK!完成!
相关文章推荐
- Linux下静态库_库的基本概念;如何生成静态库动态库;nm查看库中包含那些函数、ar生成静态库,查看库中包含那些.o文件、ldd查看程序依赖的.so文件;gcc/g++与库相关的参数-L,-l,-f
- Linux下静态库_库的基本概念;如何生成静态库动态库;nm查看库中包含那些函数、ar生成静态库,查看库中包含那些.o文件、ldd查看程序依赖的.so文件;gcc/g++与库相关的参数-L,-l,-f
- Linux下静态库_库的基本概念;如何生成静态库动态库;nm查看库中包含那些函数、ar生成静态库,查看库中包含那些.o文件、ldd查看程序依赖的.so文件;gcc/g++与库相关的参数-L,-l,-f
- Linux下静态库_库的基本概念;如何生成静态库动态库;nm查看库中包含那些函数、ar生成静态库,查看库中包含那些.o文件、ldd查看程序依赖的.so文件;gcc/g++与库相关的参数-L,-l,-f
- cocos2dx在安卓下编译报错error1:libcocos2dcpp.so 无法生成
- 怎么把activeform生成的相关的js全给删除 版本yii2.0+[证实可行]
- Linux下静态库_库的基本概念;如何生成静态库动态库;nm查看库中包含那些函数、ar生成静态库,查看库中包含那些.o文件、ldd查看程序依赖的.so文件;gcc/g++与库相关的参数-L,-l,-f
- 安卓2.3和2.2版本的最大不同——支持推送
- 安卓2.3以上版本设置与修改短信中心号码方法
- Zeroc Ice 3.6.1 生成 vs2015 c++ 版本库及相关配置
- Linux下静态库_库的基本概念;如何生成静态库动态库;nm查看库中包含那些函数、ar生成静态库,查看库中包含那些.o文件、ldd查看程序依赖的.so文件;gcc/g++与库相关的参数-L,-l,-f
- 安卓NDK开发环境配置与生成so文件方法二
- 更新AndroidStudio 2.3版本后,生成签名的apk(Generate Signed APK)时出现的新问题
- 安卓实战开发之JNI入门及高效的配置(android studio一键生成.h,so及方法签名)
- android studio(2.3)版本生成签名apk,安装提示"no certificate"
- [安卓]最新版本(OpenSSL1.0.1e)libssl.so, libcrypto.so for Android
- cordova打包安卓自己生成keystore文件,用于打包release版本的APK
- 地图随机生成lua版本
- 微博短链接的生成算法(Java 版本)