2017-12-24 7 views
0

が、私はアンドロイド上でJavaを使用する.cppファイルを持っている:JNI C++ Androidアプリのクラッシュコール機能

#include<iostream> 
#include<jni.h> 

jint Java_com_example_gatsj_tutorjatek_MainActivity_Sum(JNIEnv* env, jobject obj) 
{ 
    return 5; 
} 

私はここでそれを使用します。

package com.example.gatsj.tutorjatek; 

import android.app.Activity; 
import android.os.Bundle; 

public class MainActivity extends Activity 
{ 
    public native int Sum(); 

    static 
    { 
     System.loadLibrary("TestCPP"); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 

     int x = Sum();//IF I REMOVE THIS LINE THE APP DOESN'T CRASH 
    } 
} 

私はAndroidの中でそれを構築しますGradleとこのCMakeLists.txtを使用しているスタジオ:

cmake_minimum_required(VERSION 3.4.1) 

add_library(# Specifies the name of the library. 
      TestCPP 

      # Sets the library as a shared library. 
      SHARED 

      # Provides a relative path to your source file(s). 
      src/main/cpp/TestCPP.cpp) 

私の電話でアプリを起動するとクラッシュします。しかし、私が "int x = Sum();"アプリを起動することができます。

"loadLibrary"と "native"メソッドの部分はコード内にありますが、 "int x = Sum();"アプリがクラッシュすることはありません。

どうすればSum()メソッドを使用できますか?問題の原因は何ですか?

答えて

2

Cの代わりにC++が使用されているので、ネイティブメソッドの定義をcppファイル内のextern "C"にラップする必要があります。

extern "C" { 
    // your native method definations. 
}