用Android Studio通过Java代码调用C代码的JNI流程

1。创建本地方法 helloFromC( ),配置好NDK。点build AS会自动弹出
public class MainActivity extends AppCompatActivity {
    static {
        System.loadLibrary("hello");
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public native String helloFromC();

    public void click(View view) {
        String s = helloFromC();
        Toast.makeText(this, s, Toast.LENGTH_SHORT).show();
    }
}
2. 自动生成jni头文件
    JDK1.7:在src\main\java目录下执行javah 包名.类名
    1.6:在bin/classes目录下执行
3. 在main下创建文件夹JNI,复制jni.h文件,创建需要用C编写的hello.c文件,函数名拷贝上面自动生成的。
#include "jni.h"
jstring Java_com_itheima_hellojni_MainActivity_helloFromC(JNIEnv* env,jobject obj){
            char* str = "hello from c !!";
            //在jni规范里面 在jni环境的结构体里面
            //jstring     (*NewStringUTF)(JNIEnv*, const char*);
            //转化成了java的字符串
            return (*(*env)).NewStringUTF(env,str);
        }
4. 配置Android.mk文件
    //指定编译的文件夹  指定当前文件目录
    LOCAL_PATH := $(call my-dir)
    //编译器会定义很多的临时变量,中间变量,最好清空所有的中间变量。
    include $(CLEAR_VARS)
    //编译出来模块的名称,等下自动生成SO库的文件名
    LOCAL_MODULE :=hhhh
    LOCAL_SRC_FILES := hello.c //C写的代码文件名
    include $(BUILD_SHARED_LIBRARY)
5. 如果需要x86 mips CPU类型支持的话
    //ABI:指应用基于哪种指令集来进行编译,ABI总共有四种,分别是armeabi、  //armeabi-v7a、mips、x86,它们都是表示cpu的类型
在jni目录下创建Application.mk文件。输入下面
   APP_ABI := armeabi armeabi-v7a x86 mips
6. 需在gradle.properties末尾添加
       android.useDeprecatedNdk=true

7. 生成动态.SO库文件

**在JNI目录下执行DOS命令:ndk-build.cmd 或ndk-build**
8. 在主类中,把动态链接库加载到jvm虚拟机
    static{
        System.loadLibrary("库文件名称不带前缀,后缀名");
    }

9。最重要一步:如果出现下面错误

java.lang.UnsatisfiedLinkError: Couldn't load hell0: findLibrary returned null

.在根目录的build.gradle文件里添加

defaultConfig {
    versionCode 1
    versionName "1.0"
    ndk{
        moduleName "hhhh" //必须加上,否则在AS中就报错。
       // ldLibs "log","z","m" 可以不写,在C代码打印Log
       //这个和上面添加多CPU类型一样,可以不写
       // abiFilters "armeabi","armeabi-v7a","x86","mips"
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值