学习NDKAndroid知识

使用Android Studio完成JNI 的HelloWorl

2017-04-17  本文已影响284人  安新小子

以前学习JNI开发都是使用的Eclipse,而且已经好久没有开发过JNI相关的东西了,用进废退,现在重新看,简直就跟又重新学了一遍一样。现再我想一般都是用Android Studio来开发了吧,今天搞了一下午,在网上搜索了半天,用于搞定了一种方式,就是使用Cmake来完成JNI的开发。cmake是啥呢?它就是一个自动构建工具,通过配置文件CMakeLists.txt来进行自动化配置。在Android Studio2.2的时候,Google将它集成到了Android Studio中,在新建工程的时候可以选择勾选下面的选项

Paste_Image.png

然后一路next,全部选默认的,最后到这个页面,选择默认的即可

Paste_Image.png

然后,生成一个示例项目,在这个项目中,官方已经写好了一个JNI的Demo,项目目录如下

Paste_Image.png

相比一般的项目多了这三个目录,第一个是自动生成的,开发基本用不到,第二个是我们写的C/C++的代码,第三个就是cmake的配置文件。自动生成的MainActivity中已经完成了一个JNI的调用,直接运行就可以调用到native-lib.cpp中的代码。具体怎么写参照例子就可以。
基本就是分三步:
1:在Java类中创建一个native方法
2:创建对应的C文件,提供对应的方法
这里需要注意,C文件中对应的方法名要比Java中定义的方法名多了前缀,下面是官方Demo的截图
java中:

Paste_Image.png

C中

Paste_Image.png

多了的前缀是固定写法:Java_包名类名方法名。
这里还有一点注意的,看上面的前缀:包名本来是这样的:com.test.myapplication 但是上面使用下划线 _ 替代了 .
但是有时我们的包名或者类名中存在下划线怎么办呢,经过测试,如果存在下划线就用 1 代替
3:修改 CMakeLists.txt配置文件

下面着重说一下这个配置文件,因为这里又一个坑。
第一次打开这个文件你可能会感觉头大,其实不要着急,这里面带 # 的全是注释,下面是去掉注释的

cmake_minimum_required(VERSION 3.4.1)
add_library( 
             native-lib
             
             SHARED         
             
             src/main/cpp/native-lib.cpp )
find_library( 
              log-lib
     
              log )
target_link_libraries( 
                       native-lib
                      
                        ${log-lib} )

你是不是感觉世界突然清净了,那么这些代表什么意思呢?其实还是要看注释(哈哈,英语真的很重要)
第一行表示CMake的最小版本

add_library表示要配置的so库,第一个参数就是so的名字;第二个参数表示这个 so 是一个共享库;第三个参数是对应C代码的路径
find_library 这个看了半天注释也没搞懂什么意思,网上查也都说的模棱两可,不过我们简单的JNI开发基本用不到,就先不管了。
target_link_libraries 注释说连接目标库(即第一个参数)到 log库中,也没有搞懂,不过后面也没有用到,可能我只写了个JNI的HelloWorld比较简单的缘故。如果之后能够用到再去深入的研究吧。

看上面我坑人的解析,你就知道第一个配置是最重要的,因为我们要添加自己写的C代码啊,这就是上面提到的那个坑,之前我以为自己如果新建了一个C文件,只要在第一个add_library块中的第一个参数下面添加上自己库的名字,然后把路径添加到第三个参数下面就可以了。如下

add_library( 
             native-lib
             hello
             
             SHARED         
             
             src/main/cpp/native-lib.cpp 
             src/main/cpp/hello.c)

但是添加了之后编译时不通过的。因为不通过我知道了这么配置肯定不对,但是怎么配置呢我又不知道,于是我又一顿百度和Google(我发现要没有搜索引擎我还真做不成程序员),大多数的讲解都是在讲解官方的Demo,很少有我这样的进一步的添加一个库的讲解的(看来我还是有进步的,哈哈.....),不过,终于被我找到方法了。方法就是,没添加一个库就要重新创建一个add_library块如下所示

add_library( 
             native-lib
             SHARED
             src/main/cpp/native-lib.cpp
             )
 add_library(
        hello
        SHARED
        src/main/cpp/hello.c)
find_library(
              log-lib            
              log )
find_library(
        log-lib
        log)
target_link_libraries( 
                       native-lib
                       ${log-lib} )
target_link_libraries(
                       hello                       
                       ${log-lib} )

然后,测试就通过了。

欢迎关注我的微信公众号,我会把一些生活的感想和投资方面的总结写到公众号,希望你能来和我一起交流技术之外的东西。

张鹤的公众号
上一篇下一篇

猜你喜欢

热点阅读