JNI学习(一)hellojni

JNI已经学习了一点,觉得开始记录下一些心得比较好,也为了以后自己的复习提高。
学习JNI也是从搭建环境开始的,网上流程很多不再赘述。
第一个JNI项目依旧是Hellojni,一开始使用的IDE是eclipse,现在换成Android studio,个人感觉android studio对jni的支持更好,更方便,不需要手动生成头文件,直接在java文件里添加本地方法,在 .cpp文件中添加对应的本地方法名即可使用。

在使用android studio生成项目的时候,通过添加本地支持,来生成支持c/c++的项目,生成的项目在MainActivity中会有如下代码:

    // Used to load the 'native-lib' library on application startup.
    static {
        System.loadLibrary("native-lib");
    }

此处是用于加载本地方法库,在项目中cpp文件夹里natvie-lib.cpp中的方法都可以在此java文件中调用,hellojni项目中调用的方法,需要如下声明

    public native String stringFromJNI();

在应用调用本地的方法,返回hellojni字符串,在应用中显示,本地方法如下

extern "C"
JNIEXPORT jstring JNICALL
Java_com_seuic_ndkstudy_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject  this )
{
    std::string mString = "Hellojni";
    return env->NewStringUTF(mString.c_str());
}

代码中std::string表示string类型是从std标准域中引用的,c_str()函数返回一个指向正规C字符串的指针,内容与本string串相同。这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。
在项目中,新建一个TextView组建来显示jni返回的字符串

        TextView tv1 = (TextView) findViewById(R.id.sample_text);
        tv1.setText(stringFromJNI());

运行app时可以显示hellojni字符串,调用成功。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. linux下jni环境搭建 参考:http://blog.csdn.net/zhouyuanjing/article/details/7553706 2. 编写HelloJni工程,在主Activity(本例:HelloJni.java)里声明native函数: 如下: public native String stringFromJNI(); public native double add(double a, double b); public native double sub(double a, double b); public native double multi(double a, double b); public native double div(double a, double b); static { System.loadLibrary("hello-jni"); } 3. 在根目录下创建 jni 目录(mkdir jni). 4. 利用命令生成相应的头文件,在根目录下执行:javah -classpath bin/classes -d jni com.xxx.hello.HelloJni ————————————— ——————— ^ ^ 包名 类名 5. 编写相应的.c文件(hello-jni.c) #include<string.h> #include<jni.h> JNIEXPORT jstring JNICALL Java_com_xxx_hello_HelloJni_stringFromJNI(JNIEnv *env, jobject obj) { return(*env)->NewStringUTF(env, "Hello World from JNI !"); } JNIEXPORT jdouble JNICALL Java_com_xxx_hello_HelloJni_add(JNIEnv *env, jobject obj, jdouble a, jdouble b) { return a + b; } JNIEXPORT jdouble JNICALL Java_com_xxx_hello_HelloJni_sub(JNIEnv *env, jobject obj, jdouble a, jdouble b) { return a - b; } JNIEXPORT jdouble JNICALL Java_com_xxx_hello_HelloJni_multi(JNIEnv *env, jobject obj, jdouble a, jdouble b) { return a * b; } JNIEXPORT jdouble JNICALL Java_com_xxx_hello_HelloJni_div(JNIEnv *env, jobject obj, jdouble a, jdouble b) { return a / b; } 6. jni目录下编写Android.mk文件 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hello-jni LOCAL_SRC_FILES := hello-jni.c include $(BUILD_SHARED_LIBRARY) 在根目录下运行:ndk-build xxx@xion-driver:~/android_env/eclipse/Workspace/HelloJni$ndk-build Install : libhello-jni.so => libs/armeabi/libhello-jni.so 可以看到已经正确的生成了libhello-jni.so共享库了。 7. Eclipse运行该工程即可。 ~~完~~

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值