Linux下安卓ndk混合编译调用so方法——QuickStart学习
转自:http://www.52pojie.cn/thread-313869-1-1.html
#注意:.h 和.c中的错误eclipse不会检查,只会调用时在手机或虚拟机中死掉。因此需要仔细检查其中的语法和命名。
#Java_com_example_testforso_JniGg_ggPrintHello:Java_包名_类名_函数名
#(JNIEnv * env, jclass this)前两个参数固定。
system.loadlibrary("so名称"),与android.mk中的LOCAL_MODULE := & LOCAL_SRC_FILE := 的值对应
x1:新建立一个安卓工程
0x2:编写调用so代码和方法定义
在MainActivity.java同目录下创建一个JniGg.java文件,用于调用so
<ignore_js_op>
0x3:生成文件头.h文件
在这个目录可以看到我们编写好并且已经编译的class文件,eclipse是自动编译的。
<ignore_js_op>
一切正常编译,那么现在我们回到工程根目录下:
<ignore_js_op>
然后在命令行切换到此目录:
<ignore_js_op>
现在我们使用下面的命令:javah -classpath bin/classes -d jni com.ggndktest1.JniGg
<ignore_js_op>
不报错,并且成功编译出.h文件,才算成功的。
上面需要注意的是那个bin/classes,因为我的电脑上编译完的classes目录是这个样子的,参照上文那个文件目录的截图图片,个别电脑上不需要/classes。然后在Eclipse,右击工程,进行刷新,可以看到如下截图:
0x4:编写c代码
在jni目录下新建file,gg-jni.c自己看看代码,也就知道啥意思了
然后就是Android.mk文件的编写了
0x5:生成so文件
切换到工程根目录,然后直接ndk-build即可。这里需要注意,ndk-build需要配置环境变量,自行搜索配置方法即可。
0x6:android调用代码
新建一个TextView,然后显示so里面的字符串。然后运行我们的测试代码:
最后代码
在这个目录可以看到我们编写好并且已经编译的class文件,eclipse是自动编译的。
<ignore_js_op>
一切正常编译,那么现在我们回到工程根目录下:
<ignore_js_op>
然后在命令行切换到此目录:
<ignore_js_op>
现在我们使用下面的命令:javah -classpath bin/classes -d jni com.ggndktest1.JniGg
<ignore_js_op>
不报错,并且成功编译出.h文件,才算成功的。
上面需要注意的是那个bin/classes,因为我的电脑上编译完的classes目录是这个样子的,参照上文那个文件目录的截图图片,个别电脑上不需要/classes。然后在Eclipse,右击工程,进行刷新,可以看到如下截图:
0x4:编写c代码
在jni目录下新建file,gg-jni.c自己看看代码,也就知道啥意思了
然后就是Android.mk文件的编写了
0x5:生成so文件
切换到工程根目录,然后直接ndk-build即可。这里需要注意,ndk-build需要配置环境变量,自行搜索配置方法即可。
0x6:android调用代码
新建一个TextView,然后显示so里面的字符串。然后运行我们的测试代码:
最后代码
1 /* DO NOT EDIT THIS FILE - it is machine generated */ 2 #include <jni.h> 3 /* Header for class com_example_testforso_JniGg */ 4 5 #ifndef _Included_com_example_testforso_JniGg 6 #define _Included_com_example_testforso_JniGg 7 #ifdef __cplusplus 8 extern "C" { 9 #endif 10 /* 11 * Class: com_example_testforso_JniGg 12 * Method: ggPrintHello 13 * Signature: ()Ljava/lang/String; 14 */ 15 JNIEXPORT jstring JNICALL Java_com_example_testforso_JniGg_ggPrintHello 16 (JNIEnv *, jclass); 17 18 JNIEXPORT jint JNICALL Java_com_example_testforso_JniGg_getCoin 19 (JNIEnv *, jobject); 20 21 #ifdef __cplusplus 22 } 23 #endif 24 #endif
1 #include "com_example_testforso_JniGg.h" 2 3 JNIEXPORT jstring JNICALL Java_com_example_testforso_JniGg_ggPrintHello 4 (JNIEnv * env, jclass this) 5 { 6 return (*env)->NewStringUTF(env, "Hello!!!"); 7 } 8 9 JNIEXPORT jint JNICALL Java_com_example_testforso_JniGg_getCoin 10 (JNIEnv * env, jobject this) 11 { 12 int c=100; 13 14 return c; 15 }
1 package com.example.testforso; 2 3 public class JniGg { 4 static { 5 System.loadLibrary("gg-jni"); 6 } 7 8 static public native String ggPrintHello(); 9 static public native int getCoin(); 10 }
1 TextView tview; 2 @Override 3 protected void onCreate(Bundle savedInstanceState) { 4 super.onCreate(savedInstanceState); 5 setContentView(R.layout.activity_main); 6 7 tview=(TextView) this.findViewById(R.id.coin); 8 9 tview.setText(JniGg.ggPrintHello()+JniGg.getCoin()); 10 }
相关附件和文档:
http://pan.baidu.com/s/1pJ2Y047
联系方式:emhhbmdfbGlhbmcxOTkxQDEyNi5jb20=