您的位置:首页 > 移动开发 > Android开发

Android NDK 构建 以及一些错误

2015-08-14 12:35 543 查看
首先下载NDK 然后在最外层的

local.properties文件夹中 写上 ndk的路径

ndk.dir=/Users/wyj/Desktop/androidStudioSdk/android-ndk-r10d

1.新建工程myapp

2.在MainActivity中写好

public static native String stringFromJNI();

#include <stdio.h>
#include <string.h>
#include "com_example_wyj_myapplication_MainActivity.h"

JNIEXPORT jstring JNICALL Java_com_example_wyj_myapplication_MainActivity_stringFromJNI
(JNIEnv *env, jclass jclass){
return (*env)->NewStringUTF(env, "Hello from wf! ");
}


View Code

4.生成 so文件

终端在jni的上一级目录中 执行 ndk-build (ndk-build所在路径中的文件夹不得存在空格否则就报错了)



5.使用 so文件



在main中建立 jniLibs文件夹 然后把 armeabi/*.so 拷贝进去 然后就可以访问了。

或者不新建jniLibs文件夹,那么在build.gradle中

android {
sourceSets {
main {
        jniLibs.srcDirs = ['xxx']
        }
       }
      }

jniLibs.srcDirs = ['xxx'] //这里xxx代表一个目录。可以改变jniLibs的读取路径 , 默认的 jniLibs结构是 src/main/jniLibs

指定xxx是libs就可以了armeabi不需要在路径中指定,它是不同设备下的自动会被寻找的。

6.在MainActivity中 写上

public static native String  stringFromJNI();
static {
System.loadLibrary("hello");   //装载库文件
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String str=stringFromJNI();  //可被使用
System.out.print(str);
}


7.运行程序就可以 stringFromJNI 就可以看出结果了

额外说明:

.c文件中的函数为

1 JNIEXPORT jstring JNICALL Java_com_example_wyj_myapplication_MainActivity_stringFromJNI

类的结构 是 com.example.wyj.myapplication 文件包结构的 MainActivity类 下面的 stringFromJNI 函数才能被识别并使用

放入其它工程如果不是遵从这个结构的 会报错,函数找不到,当然*.so可以加载。

如果其他工程是遵守如下结构的当然也能识别出stringFromJNI函数并使用

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: