随便新建一个Empty Activity
起个名emp
然后右键main,新家一个目录cxk,与java同目录
【
为什么不直接把c文件放在java目录下?因为会报错
】
然后在cxk目录下新建一个CMakeLists.txt和c文件,
这里记得选c文件
效果如下:
然后.c文件写入如下内容
#include <jni.h>
JNIEXPORT jstring JNICALL Java_com_a_emp_MainActivity_g
(JNIEnv *env,jobject obj)
{
return (*env)->NewStringUTF(env,"Hello from C , chicken you so beautiful !");}
如果是C++
【
extern "C" jstring Java_com_a_MainActivity_g(JNIEnv* env,jobject thiz){
return env->NewStringUTF("hello, I am from C++");
另外,如果java中用的是静态方法,就要用jclass代替jobject
】
到CMakeLists.txt,添加如下内容
cmake_minimum_required(VERSION 3.4.1)
add_library(ctrlm SHARED cxk.c)
在app的build.gradle中的android {}闭包内任意位置添加如下语句
externalNativeBuild {
cmake {
path "src/main/cxk/CMakeLists.txt"
version "3.10.2"
}
}
点一下右上角sync now
【
如果报错
executing external native build for cmake
检查一下,是txt文件中指向的c文件名和我实际的不一致导致出现的问题,但是这个提示不明显,改完后就好了。
】
回来可以看到txt文件变颜色了
说明build.gradle中的内容起了作用,我们可以把build.gradle刚刚新增的那段删除,
再点一下右上角刷新,
右键左侧的任意文件或文件夹,点击Link C++ Project with Gradle
会在build.gradle中增加如下内容,效果是一样的。
此时可以尝试点一下左上角的绿色锤子编译一下
可以看到生成了ctrlm的so文件
MainActivity.java中添加如下语句
package com.a.emp;
import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView=findViewById(R.id.id_text);
textView.setText(g());
}
static {System.loadLibrary("ctrlm");}
private native String g();}
效果如下: