您的位置:首页 > 移动开发 > Android开发

android studio使用jni

2016-05-27 14:31 204 查看
如果你要使用jni的话首先下载一个ndk,然后配置一下环境变量。

在android studio中点击file->project structure中配置



然后在app->src->main中创建一个jni文件夹。



在jni文件中创建一个c文件,.c为后缀。

#include<stdio.h>
#include<stdlib.h>
#include<jni.h>

jstring Java_com_jiang_shuaijie_test_HelloActivity_helloFromC(JNIEnv* env,jobject thiz){
char* arr="hello c";
jstring jstr=(*(*env)).NewStringUTF(env, arr);
return jstr;
}

这是最基本的代码,返回一个字符串。jstring是ndk中定义好的一个字符串基本类型。

JNIEnv* env,jobject thiz

方法的参数是固定。你可以参考ndk文件夹下sample文件夹,里面有很多的事例。
Java_com_jiang_shuaijie_test_HelloActivity_helloFromC

这个是你java类中方法所在的位置。比如:

package com.jiang.shuaijie.test;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

public class HelloActivity extends AppCompatActivity {
static {
System.loadLibrary("hello");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_hello);

}

public void onClick(View view) {
Toast.makeText(this, helloFromC(), Toast.LENGTH_SHORT).show();
}

public native String helloFromC();
}

这是我在java中创建的一个activity类。helloFromC()方法为本地c调用的方法,要在类型名前加上native定义。里面的static静态初始化把编译好的libhello.so文件加载进来。

文件创建好之后,你还需要在jni文件中创建一个Android.mk配置文件。

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := hello
LOCAL_SRC_FILES := Hello.c

include $(BUILD_SHARED_LIBRARY)

LOCAL_MODULE 这个是你起的类库的名字
LOCAL_SRC_FILES 这个是类库的源文件

编写好之后再jni文件夹中使用命令ndk-build.cmd编译,编译成功就可以运行了。

如果你要调用带参数的方法,只需在

jstring Java_com_jiang_shuaijie_test_HelloActivity_helloFromC(JNIEnv* env,jobject thiz)
括号内继续加参数。比如:(JNIEnv* env,jobject thiz,jint a,jint b)


由于cpu平台架构的不同,有x86,arm的当你使用jni时会自动编译成arm的so文件,在x86下不能使用。所以为了兼容,ndk6.0以上的可以在jni下创建一个Application.mk配置文件,内容为:

APP_ABI := armeabi armeabi-v7a x86

然后在jni目录下重新编译会编译成三个目录,如上的三个目录。这样你就可以在两个平台上使用了。

你可以直接编译运行,不需要单独编译c文件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: