android studio 3.0 JNI编程并生成.so文件

 

https://blog.csdn.net/ziyoutiankoong/article/details/79696279

 

当前环境: 
android studio 3.0.0 

android-ndk版本:

1、创建android项目 (JNIDemo)

2、创建jni文件夹

右键 src->New->Folder->JNI Folder 如图:

结果如图:

3、创建JNI类

 

[java] view plain copy

  1. <code class="language-java">public class JNITest {  
  2.   
  3.     static {  
  4.         System.loadLibrary("JniLib");  
  5.     }  
  6.   
  7.     public native String getString();  
  8.   
  9. }</code>  

如图:

3.1生成.h文件

3.1.1方法一

配置 Anroid Studio 外部工具,一劳永逸,往后无需命令行,File->Setting->Tools->External Tools->“+”进入页面

Program:$JDKPath$\bin\javah.exe

Parameters:-classpath . -jni -d $ModuleFileDir$\src\main\jni $FileClass$

Working directory:$ModuleFileDir$\src\main\Java

注释:

-classpath classes 指明类所在的位置

-jni com.jni.jnitest.JNITest 类的绝对路径

-d 产生的.h文件放到指定目录下;

配置成功如图:

开始生成.h文件,选中JNI类右键->New->External Tools->javah,如图:

成功后如图:

3.1.2方法二

右键拖动JNI类所在的包的路径到Terminal,自动切换到该目录下

javac编译生成class文件(生成class文件的方法有很多,这里提供一种)

右键拖动java文件夹到Terminal,自动切换到该目录下

必须在包名外使用javah命令,编译生成.h文件,把.h文件移动到jni文件夹(生成.h文件后可以删除class文件)如图:

3.2、创建文件 JniLib.cpp 、Android.mk、Application.mk

在jni目录下分别创建并编写 JniLib.cpp、Android.mk、Application.mk 这三个文件

复制.h文件内容到JniLib.cpp并修改,如下(此文件为JNI内容文件):

 
  1. /* DO NOT EDIT THIS FILE - it is machine generated */

  2. #include <com_jni_jnitest_JNITest.h>

  3. /* Header for class com_jni_jnitest_JNITest */

  4.  
  5. /*

  6. * Class: com_jni_jnitest_JNITest

  7. * Method: getString

  8. * Signature: ()Ljava/lang/String;

  9. */

  10. JNIEXPORT jstring JNICALL Java_com_jni_jnitest_JNITest_getString

  11. (JNIEnv * env, jobject jobject){

  12.  
  13. return (*env).NewStringUTF("成功调用JNI内容");

  14.  
  15. }

Android.mk

 
  1. LOCAL_PATH := $(call my-dir)

  2.  
  3. include $(CLEAR_VARS)

  4.  
  5. LOCAL_MODULE := JniLib

  6. LOCAL_SRC_FILES =: JniLib.cpp

  7. include $(BUILD_SHARED_LIBRARY)

Application.mk

 
  1. APP_MODULES := JniLib

  2. APP_ABI := all

4、其它相关配置

4.1 修改app下的build.gradle文件, 如下图

 
  1. ndk{

  2. moduleName "JniLib"

  3. // abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定的三种abi体系下的so库

  4. }

  5. sourceSets.main{

  6. jni.srcDirs = []

  7. jniLibs.srcDir "src/main/libs"

  8. }

4.2 项目下的gradle.properties文件(如果没有此文件,自己新建一个)添加代码:

android.useDeprecatedNdk=true

5、执行ndk-build

此处我用的是配置好的工具来执行,和 3.1.1 一样的步骤

选中JNI类右键->New->External Tools->ndk-build,结果如图:

6、调用so

 
  1. package com.jni.jnitest;

  2.  
  3. import android.support.v7.app.AppCompatActivity;

  4. import android.os.Bundle;

  5. import android.view.View;

  6. import android.widget.Button;

  7. import android.widget.TextView;

  8.  
  9. public class MainActivity extends AppCompatActivity {

  10. Button button;

  11. TextView tv;

  12.  
  13. @Override

  14. protected void onCreate(Bundle savedInstanceState) {

  15. super.onCreate(savedInstanceState);

  16. setContentView(R.layout.activity_main);

  17. button = findViewById(R.id.button);

  18. tv = findViewById(R.id.tv);

  19.  
  20. button.setOnClickListener(new View.OnClickListener() {

  21. @Override

  22. public void onClick(View view) {

  23. tv.setText("结果:"+ new JNITest().getString());

  24. }

  25. });

  26.  
  27. }

  28. }

结果

Demo 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值