打开 ADT 新建Android空白项目 全部默认下一步
使用jni写的需要用native修饰
首先在ADT中新建 jni文件夹
右击src文件夹 选择 Properties 查看文件夹路径
这里为 C:\Users\asura\source\repos\Android_JNI\02_JNI_register\Jnidemo\src
打开命令行 到达指定的目录执行javah命令
1
|
javah -jni -d ../jni com.example.jnidemo.MainActivity
|
刷新ADT后发现jni路径下生成对应的头文件
如果上述操作完全没错,但依然提示找不到xxx的类文件!需要先使用命令来进行切换
1
|
set classpath=C:\Users\asura\source\repos\Android_JNI\02_JNI_register\Jnidemo\src
|
在jni文件夹内新建文件
com_example_jnidemo_MainActivity.cpp
1
2
3
4
5
6
7
|
#include "com_example_jnidemo_MainActivity.h"
JNIEXPORT jstring JNICALL Java_com_example_jnidemo_MainActivity_Hello
(JNIEnv * env, jobject obj)
{
return env->NewStringUTF("Hello JNI");
}
|
Android.mk
1
2
3
4
5
6
|
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_ARM_MODE := arm
LOCAL_MODULE := hello #模块名称
LOCAL_SRC_FILES := com_example_jnidemo_MainActivity.cpp #源文件名
include $(BUILD_SHARED_LIBRARY) #编译为so库文件
|
Application.mk
1
|
APP_ABI := x86 armeabi-v7a
|
命令行进入jni目录下执行编译命令
看到输出.so文件成功则说明编译成功
回到java文件中 编写加载so代码的逻辑
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
package com.example.jnidemo;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.Toast;
public class MainActivity extends Activity {
static {
System.loadLibrary("hello"); //加载hello模块
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toast.makeText(this,MainActivity.this.Hello(), 1).show(); //调用jni内方法
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
private native String Hello();
}
|
https://github.com/luodaoyi/Android_JNI/tree/master/02_JNI_register
如果是用android studio 请看NCK大佬的文章
安卓逆向4.Android Studio JNI静态注册(一个简单的JNI静态注册流程) – 凉游浅笔深画眉 – 博客园