终于搞通了!!!
终于搞通了!!!
终于搞通了!!!
现在把过程记录如下:
一 环境配置:
Windows7(32位)
Android Studio(2.3.0)
Gradle(3.3)
NDK(android-ndk-r14b)
二 代码编写
总结步骤:编译出*.h,新建*.c实现方法,然后生成*.so。
1 新建Android项目,过程略...
注意事项:不用勾选C++支持。
2 在src/main/java/com/hs/helloworld中新建JniTest.java文件,代码如下:
package com.hs.helloworld;
public class JniTest {
public native String doSomeThing();
}
注意事项:1.注意native不能忘了
2.关于导入*.so语句(System.loadLibrary(“XXX”))不要写在这里,我最开始的时候写在这里,结果浪费了一个上午!!!!!一个上午!!!!贰
3 编译JniTest.class
使用CMD命令行编译(可以使用Android Studio界面下发的Terminal选项卡操作)
第一步 cd app/src/main/java/
第二步 javac xxx/xxx/xxx/JniTest.java(我的操作是: javac com/hs/JNI/JniTest.java)
这两步完成后会在 com/hs/helloworld 文件夹中生成JniTest.class
4 使用JniTest.class编译*.h文件
这一步同样使用CMD命令行操作(可以使用Android Studio界面下发的Terminal选项卡操作)
在app\src\main\java目录下执行以下命令
javah -jni xxx.xxx.xxx.JniTest(我这里执行的是:javah -jni com.hs.helloworld.JniTest)
这一步执行完毕后再当前目录下生成了*.h文件。这个文件相当关键,到目前为止,所有的一切都为了这个*.h
这个com_hs_helloworld_JniTest.h内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_hs_helloworld_JniTest */
#ifndef _Included_com_hs_helloworld_JniTest
#define _Included_com_hs_helloworld_JniTest
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_hs_helloworld_JniTest
* Method: doSomeThing
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_hs_helloworld_JniTest_doSomeThing
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
5 编写Android.mk与Application.mk
第一步 在src/main文件夹中新建jni文件夹,保存C/C++代码,并将非常重要的*.h文件拷贝到此文件夹中。
第二步 在src/main/jni文件中新建JniTest.c文件,实现*.h中的函数。代码如下
#include "com_hs_helloworld_JniTest.h"
JNIEXPORT jstring JNICALL Java_com_hs_helloworld_JniTest_doSomeThing
(JNIEnv *env, jobject obj)
{
return (*env)->NewStringUTF(env, "This is Test JNI");
}
第三步 在src/main/jni文件中新建Android.mk文件, 内容如下
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := JniTest
LOCAL_SRC_FILES := JniTest.c
include $(BUILD_SHARED_LIBRARY)
第四步 在src/main/jni文件中新建Application.mk文件
APP_ABI := armeabi armeabi-v7a x86
这四步完成后目录结构如下:
6 生成*.so文件
这一步同样使用CMD命令行操作(可以使用Android Studio界面下发的Terminal选项卡操作)
如果上述步骤正常,那么这里就会有成果出来。
第一步 进入jni文件夹(cd app/src/main/jni)
第二部 构建JniTest.so (ndk-build)
注意:这里需要在PATH系统路径中添加NDK目录,如果未添加,这里第二步是无法执行的。关于如何在系统路径(PATH)中添加NDK路径,在此不再详述。
这一步结束后目录会在src/main/文件中生成libs文件夹和中间文件夹obj,我们要用的就是libs中的文件
7 使用*.so文件
第一步 在local.properties中添加 ndk.dir=D\:\\android-ndk-r14b(这里是NDK路径)文件内容如下
第二步 在app/build.gradle文件中添加如下语句
buildTypes{
......
sourceSets{
main {
jniLibs.srcDir 'src/main/libs'
jni.srcDirs = [] //disable automatic ndk-build call
}
}
......
}
第三步 在MainActivity.java中添加导入语句
public class MainActivity extends AppCompatActivity {
......
static {
System.loadLibrary("JniTest");
}
......
}
终于结束了,最后在代码中调用就好了
我以前做C++,现工作需要,学习android,当然第一步就是考虑Android中如何使用C++。
这个过程是相当艰苦的。