android

02_JNI-Eclipse上的开发环境

2017-02-26  本文已影响180人  对方不想理你并向你抛出一个异常

开发步骤

public native String  helloFromC();

#include <stdio.h>
#include <stdlib.h>
#include <jni.h>

jstring Java_com_huachao_jnihelloworld_MainActivity_helloFromC(JNIEnv* env , jobject thiz){

    char* cstr = "hello from c";

    return (*env)->NewStringUTF(env,cstr);
} 
Android NDK: WARNING: APP_PLATFORM android-21 is larger than android:minSdkVers
on 8 in ./AndroidManifest.xml
Android NDK: Your APP_BUILD_SCRIPT points to an unknown file: ./jni/Android.mk

LOCAL_PATH := $(call my-dir)//设置为当前目录
include $(CLEAR_VARS)                //清空变量

LOCAL_MODULE    := hello//编译生成的文件名称
LOCAL_SRC_FILES := hello.c//.c源文件名称

include $(BUILD_SHARED_LIBRARY)

注意:
1,LOCAL_MODULE := hello,编译后,编译器会给文件添加lib前缀和.so后缀,例如本例生成libhello.so
2,若新建的文件夹名不是jni,或者修改了jni的文件夹名称,则在ndk-build的时候,不能在项目目录下build,要cd到这个目录下,再执行ndk-build

public class MainActivity extends Activity {
    static{
        System.loadLibrary("hello");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public native String  helloFromC();
    public void onClick(View v) {
        String c = helloFromC();
        Toast.makeText(this, c, Toast.LENGTH_LONG).show();
    }
}  

开发中常见错误

方法名

public native String  hello_FromC(); 
jstring Java_com_huachao_jnihelloworld_MainActivity_hello_1FromC(JNIEnv* env , jobject thiz){
} 

F:\as\Eclipse\personal\JNI\01-JNIHelloWorld\src>javah -jni com.huachao.jnihelloworld.MainActivity

Application.mk配置

多平台

SDK版本配置

android-3 -> Official Android 1.5 system imagesandroid-4 -> Official Android 1.6 system imagesandroid-5 -> Official Android 2.0 system imagesandroid-6 -> Official Android 2.0.1 system imagesandroid-7 -> Official Android 2.1 system imagesandroid-8 -> Official Android 2.2 system imagesandroid-9 -> Official Android 2.3 system imagesandroid-14 -> Official Android 4.0 system imagesandroid-18 -> Official Android 4.3 system images

简单开发流程

注意:在eclipse的jni开发中,包名不能包含下划线,否则在运行时运行不了,但是却不报错

在JNI开发中,指定NDK目录,是更换workspace的时候才要做,其他的都是每次新建项目都是要做的

取消上面两个红色箭头的勾选

绕过JNI调用C代码

arm-none-linux-gnueabi-gcc.exe是编译命令
bin/arm-none-linux-gnueabi-ld.exe是链接命令

 #include <stdio.h>
 int main()
 {
 printf("Hello, Android!\n");
 return 0;
 }
public void binExce(View v) {//点击事件
     try {
//     Process process = Runtime.getRuntime().exec("/data/data/hello");//hello是我们自己编译并且放入的库文件
 Process process = Runtime.getRuntime().exec("ps");
 InputStream is = process.getInputStream();
 DataInputStream dis = new DataInputStream(is);
 String res ;
 StringBuilder sb = new StringBuilder();
 while ((res = dis.readLine()) !=null) {
 sb.append(res);
 sb.append("\n");
 }
 System.out.println("--->"+sb.toString());
 } catch (IOException e) {
 e.printStackTrace();
 }
 }

注意:上述步骤只在Android 4.x下测试生效,高版本没有测试

上一篇下一篇

猜你喜欢

热点阅读