android调用本地C/C++代码,jni的实现

来源:互联网 发布:php开源网店系统 编辑:程序博客网 时间:2024/04/20 05:10

说明:java调用本地C/C++的代码需要通过jni来实现。

准备工作:首先需要下载安装ndk,他负责创建so库同你的android代码打包成apk文件。高版本的ndk自带打包工具,所以不需要再安装cygwin了。

现在进行我们的第一个jni程序

新建一个android项目,新建一个类,取名叫myjni。

public class myjni {
 static {
        System.loadLibrary("hello-jni");//加载库 libtest.so
    }
 public static native int plus(int a, int b);//对应native层的Java_com_mylzc_jni_Jni_plus函数
 public static native String getText(String name);//对应native层的Java_com_mylzc_jni_Jni_plus函数

}

该类负责本地C语言代码的声明,首先加载库,我们取名叫hello-jni(后面会创建),然后声明两个函数(用native修饰代表本地)。

plus函数将a与b相加,getText函数,显示字符串

主activity这么写:
public class MainActivity extends Activity {
 TextView tv1;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myjni jni=new myjni();
        Log.v("debug",jni.plus(10, 20)+"");
        tv1=(TextView)findViewById(R.id.my);
        tv1.setText("gaga"+jni.plus(10, 20)+jni.getText("what"));

    }
}

进入cmd,进入该项目根目录下输入javah -classpath bin/classes -d jni com.example.hellonkd1.myjni

执行完后会在项目根目录下出现一个jni文件夹,里面有com_example_hellondk1_myjni.h文件。

可以打开该文件看看

接下来我们将新建一个文件com_example_hello_ndk1_myjni.cpp,将.h文件复制到该文件内,将代码改为如下c代码。

#include <jni.h>
#include<stdio.h>
#include<string.h>
extern "C" {
jint Java_com_example_hellondk1_myjni_plus
  (JNIEnv *, jclass, jint x, jint y) {
    return x + y;//返回x+y的结果
}
JNIEXPORT jstring JNICALL  Java_com_example_hellondk1_myjni_getText
  (JNIEnv *env, jclass, jstring str) {
 /*
 //从jstring类型取得c语言环境下的char*类型
 const char* name = env->GetStringUTFChars(str, 0);
 //本地常量字符串
 char* hello = "你好,";
 //动态分配目标字符串空间
 char* result = (char*)malloc((strlen(name) + strlen(hello) + 1)*sizeof(char));
 memset(result,0,sizeof(result));
 //字符串链接
 strcat(result,hello);
 strcat(result,name);
 //释放jni分配的内存
 env->ReleaseStringUTFChars(str,name);
 */
 //生成返回值对象
 //释放动态分配的内存
 //free(result);
 //
 return env->NewStringUTF("hello world");

}

}

接下来需要编写Android.mk配置文件,内容如下

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := hello-jni
LOCAL_SRC_FILES := com_example_hello_ndk_1_myjni.cpp

include $(BUILD_SHARED_LIBRARY)

名称为hello-jni就是我们之前加载的那个,源文件是刚才编的c文件com_example_hello_ndk1_myjni.cpp

新建Application.mk,内容如下

APP_ABI := all

all是让配置所有环境下so库。

至此大功告成,jni文件夹下有4个文件

还有最后一步,使用ndk自带的工具打包so库(该工具在ndk根目录,名为ndk-build)

进入cmd,进入该项目根目录,输入ndk-build,你会看有很多操作结果。

同时在libs文件夹下会生成很多.so文件

运行你的工程吧,是不是很简单呢?

 

 

ndk下载链接:点击打开链接

demo链接:点击打开链接

 

0 0
原创粉丝点击