使用Android Studio进行JNI开发

一、概述

前篇讲述了使用Eclipse进行JNI开发,这篇就简单讲一下使用Android Studio进行JNI开发的过程。

二、使用Android Studio进行JNI开发的步骤:

1、编写带有native声明的方法的java类。

2、使用Terminal生成.h文件。

3、使用C/C++实现本地方法。

4、配置NDK。

5、将C/C++编写的文件生成动态连接库。

6、编写Java调用代码、进行测试。

三、按照上述步骤进行开发工作

1、编写带有native声明的方法的java类。

package com.testjnii;
public class TestJNI {
    static {
        System.loadLibrary("testjni");
    }
    public native String getString(String n);
    public native int getSum(int num1,int num2);
}

2、使用Terminal生成.h文件。

     2.1、Build->Make Project,生成对应的class文件。

     2.2、打开View->Tool Windows->Terminal,使用命令进入到app/src/main目录下:

cd app/src/main

操作下述命令:

javah -d jni -classpath <SDK_android.jar>;<APP_classes> com.testjnii.TestJNI


这里我们输入:

javah -d jni -classpath D:\adt-bundle-windows-x86_64-20140702\sdk\platforms\android-16\android.jar;..\..\build\intermediates\classes\debug com.testjnii.TestJNI
如下图:


敲回车,你会看到在项目app/src/main下自动生成名称为"jni"的文件夹,jni文件夹下是根据包名自动生成的.h文件,如下图:


点开该.h文件,我们会看到刚才在TestJNI中声明的文件名,如下图:



3、使用C/C++实现本地方法。

新建xxx.c或者xxx.cpp文件(右击jni->New->C/C++ Source File),至于.c和.cpp的区别上篇已经讲过,这里我们新建testjni.cpp文件并编写如下代码:

#include <jni.h>
extern "C" {
/*
 * Class:     com_testjnii_TestJNI
 * Method:    getString
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_testjnii_TestJNI_getString
  (JNIEnv *env, jobject obj, jstring js){

    return js;
  }

/*
 * Class:     com_testjnii_TestJNI
 * Method:    getSum
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_com_testjnii_TestJNI_getSum
  (JNIEnv *env, jobject obj, jint num1, jint num2){
  return num1+num2;
  }

}

到这里,执行Build->Make Project,此时"Messages Gradle Build"会给出提示如下:

Error:Execution failed for task ':app:compileDebugNdk'.
> Error: NDK integration is deprecated in the current plugin.  Consider trying the new experimental plugin.  For details, see http://tools.android.com/tech-docs/new-build-system/gradle-experimental.  Set "android.useDeprecatedNdk=true" in gradle.properties to continue using the current NDK integration.

下面我们要配置NDK了~

4、配置NDK。

     4.1、根据提示,我们找到gradle.properties,在最后添加一句代码:

android.useDeprecatedNdk=true
再次进行Build->Make Project,会出现如下警告,我们按照提示一步一步来操作:
Warning:Native C/C++ source code is found, but it seems that NDK option is not configured.  Note that if you have an Android.mk, it is not used for compilation.  The recommended workaround is to remove the default jni source code directory by adding: 
android {  
  sourceSets {      
  main {           
 jni.srcDirs = []     
   }
 }
}
to build.gradle, manually compile the code with ndk-build, and then place the resulting shared object in src/main/jniLibs.
根据提示可以看出是NDK未配置,我们有两种方法解决,一种是在jni目录下添加Android.mk文件,另外一种就是在build.gradle文件中添加上述代码,添加Android.mk文件的方法在上篇博客已经讲过,这里我们采用第二种方法:
打开app目录下的build.gradle文件,在android分支下添加如下代码:

sourceSets {
        main {
            jni.srcDirs = ['src/main/jni', 'src/main/jni/']
        }
    }
再次进行Build->Make Project,这时程序没有警告了~~
     4 .2、在local.properties中添加ndk路径:

ndk.dir=D\:\\android-ndk-r10b

Rebuild Project,会出现如下error:

Error:Execution failed for task ':app:compileDebugNdk'.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'D:\android-ndk-r10b\ndk-build.cmd'' finished with non-zero exit value 2
解决方法就是在jni目录下新建一个空的.c文件,例如empty.c,新建成功后Rebuild一下没有其他error

5、将C/C++编写的文件生成动态连接库。

Rebuild之后,会在app/build/intermediates/ndk/debug目录下生成两个文件夹(lib、obj)和Android.mk文件,如下图:


6、编写Java调用代码、进行测试。

package com.testjnii;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends Activity {

    String ss="HelloJNI";
    int num1=100,num2=200;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TestJNI testJNI=new TestJNI();
        TextView textView=new TextView(this);
        textView.setText(testJNI.getString(ss)+"=="+testJNI.getSum(num1,num2));
        setContentView(textView);
    }
}
运行截图如下:




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值