1、设置NDK
local.properties
ndk.dir=C:\Users\dong\AppData\Local\Android\Sdk\ndk-bundle
sdk.dir=C:\Users\dong\AppData\Local\Android\Sdk
2、创建JNI.java
package com.example.dong.ndkdemo;
public class JNI {
{
System.loadLibrary("hello");
}
// native 用于调用C对应的函数
public native String sayHello();
}
3、main下创建jni目录,创建文件Hello.c,Android.mk
Hello.c
#include <jni.h> //方法名必须为本地方法的全类名点改为下划线,穿入的两个参数必须这样写, //第一个参数为Java虚拟机的内存地址的二级指针,用于本地方法与java虚拟机在内存中交互 //第二个参数为一个java对象,即是哪个对象调用了这个 c方法 jstring Java_com_example_dong_ndkdemo_JNI_sayHello(JNIEnv* env,jobject obj){ char* text="I from C"; return (*env)->NewStringUTF(env,text); }
Android.mk
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) #编译生成的文件的类库叫什么名字 LOCAL_MODULE := hello #要编译的c文件 LOCAL_SRC_FILES := Hello.c include $(BUILD_SHARED_LIBRARY)
4、设置app/bulid.gradle
defaultConfig { ........
....... ndk{ moduleName "Hello"//so文件 app/build/intermediates/ndkBuild/debug/obj/local/{*}/libhello.so abiFilters "armeabi-v7a","arm64-v8a","x86","x86_64"//cpu类型arm、 mips "armeabi" } }
externalNativeBuild {
ndkBuild {
path 'src/main/jni/Android.mk'
}
}
5修改文件
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); String result=new JNI().sayHello(); System.out.println("result=="+result); } }
继续测试
1、File------New Module ----名称javaCallC
2、创建JNI.java
public class JNI { public native int add(int a,int b); public native String sayHello(String s); public native int[] increateArrayEles(int[] intArray); public native int checkPwd(String pwd); }
3、生成头文件
在Terminal中进入切换至目录 javacallcsrcmainjni
执行javah com.example.javacallc.JNI
X:****javacallcsrcmainjava>javah com.example.javacallc.JNI javah javac 不是内部或外部命令 解决方法 这是因为java10已经移除了javah的相关功能。
为了使用java 10生成头文件,在windows的cmd命令行中使用以下命令:
javacallcsrcmainjavacomexamplejavacallc>javac -h . JNI.java
这样就会生成com_example_javacallc_JNI.h 文件,将文件移动到jni目录