Android NDK JNI 学习过程

终于搞通了!!!

终于搞通了!!!

终于搞通了!!!


现在把过程记录如下:

一 环境配置:

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++。

这个过程是相当艰苦的。



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值