一、设置NDKjava
local.propertieswindows
ndk.dir=C\:\\Users\\dong\\AppData\\Local\\Android\\Sdk\\ndk-bundle
sdk.dir=C\:\\Users\\dong\\AppData\\Local\\Android\\Sdk
二、建立JNI.javaapp
package com.example.dong.ndkdemo;
public class JNI {
{
System.loadLibrary("hello"); } // native 用于调用C对应的函数 public native String sayHello(); }
三、main下建立jni目录,建立文件Hello.c,Android.mkide
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)
四、设置app/bulid.gradlegradle
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\修改文件ui
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); } }
继续测试spa
一、File------New Module ----名称javaCallC命令行
二、建立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); }
三、生成头文件
在Terminal中进入切换至目录 javacallc\src\main\jni
执行javah com.example.javacallc.JNI
X:\**\**\javacallc\src\main\java>javah com.example.javacallc.JNI javah javac 不是内部或外部命令 解决方法 这是由于java10已经移除了javah的相关功能。
为了使用java 10生成头文件,在windows的cmd命令行中使用如下命令:
javacallc\src\main\java\com\example\javacallc>javac -h . JNI.java
这样就会生成com_example_javacallc_JNI.h 文件,将文件移动到jni目录